對象被判斷為垃圾的標(biāo)準(zhǔn)
引用計數(shù)算法(基本不用)
1.通過判斷對象引用的數(shù)量決定對象是否被回收
2.每個對象都有一個引用計數(shù)器晚树,被引用+1弄诲,引用完-1(變量被賦予新值,或含參方法調(diào)用完畢)
3.引用計數(shù)為0的對象就可以被回收了。
優(yōu)點(diǎn):執(zhí)行效率高啡彬,程序執(zhí)行受影響較小。
缺點(diǎn):無法檢測出循環(huán)引用故硅,導(dǎo)致內(nèi)存泄漏庶灿。
可達(dá)性分析算法()
通過判斷對象的引用鏈?zhǔn)欠窨蛇_(dá)來決定對象是否可以被回收(圖論)
可以作為GC Root的對象
1.棧中引用的對象(棧幀中的本地變量表)new了一個Object賦值給一個局部變量 Object就是Root
2.方法區(qū)中常量引用的對象
3.方法區(qū)中的類靜態(tài)屬性引用的對象
4.本地方法棧JNI以及Native的引用的對象
5.活躍的現(xiàn)成的對象
垃圾回收算法
標(biāo)記清楚算法
標(biāo)記:從根基和進(jìn)行掃描,對存活的對象進(jìn)行標(biāo)記
清除:堆堆內(nèi)存從頭到尾進(jìn)行線性遍歷吃衅,回收不可達(dá)對象內(nèi)存
會產(chǎn)生很多不連續(xù)的內(nèi)存碎片
viewter出入暫停狀態(tài)往踢,collector處于嘗試?yán)占钡絆utOfMemoryError錯誤
復(fù)制算法
分為對象面和空閑面
對象在對象面上創(chuàng)建
存活的對象被從對象面復(fù)制到空閑面
將對象面所有對象內(nèi)存清除
特點(diǎn):
1.解決碎片化問題
2.順序分配內(nèi)存徘层,簡單高效
3.適用于對象存活率低的場景
標(biāo)記整理算法
標(biāo)記:從根集合進(jìn)行掃描峻呕,對存活的對象進(jìn)行標(biāo)記
清除:移動所有存活的對象,且按照內(nèi)存地址次序依次排列趣效,然后將末端內(nèi)存地址以后的內(nèi)存全部回收
特點(diǎn):
1.避免內(nèi)存不連續(xù)性
2.不用設(shè)置兩塊內(nèi)存互換
3.適用于存活率高的場景
分代收集算法
按照對象生命周期的不同劃分區(qū)域采用不同的垃圾回收算法
目的:提高JVM回收效率
JDK8及以后的版本
只有年輕代和老年代
年輕代幾乎是所有Java對象出生的地方(Java申請的內(nèi)存山上,存放都在這里,(Java對象通常不需要長久存活))
年輕代存活率低(復(fù)制算法)
老年代存活率高(標(biāo)記清除算法英支,標(biāo)記整理算法)
GC分類
Minor GC(發(fā)生在年輕代中佩憾,復(fù)制算法)
Eden(伊甸)區(qū):對象剛被創(chuàng)建的時候,首先放在這個區(qū),放不下再考慮老年代或者Survivor區(qū)
兩個Survivor區(qū)(from和to):
Full GC()
1
1
1
1
1
1
1
1
1
1
1
1