新生代滿了會觸發(fā) Young GC砚嘴,老年代滿了會觸發(fā) Old GC。GC時會回收對象涩拙,那么具體是什么樣的對象會被垃圾回收器回收呢际长?
- 可達性分析算法,判斷是否被 GC Roots 引用
- 判斷引用類型:強引用吃环、軟引用也颤、弱引用、虛引用
- 是否調(diào)用
finialize()
方法自救
首先郁轻,JVM 會通過可達性分析算法來判斷哪些對象會被回收翅娶,哪些不會被回收『梦ǎ可達性分析算法會從一個對象觸發(fā)竭沫,一層層向上,分析有誰在引用它骑篙,看是否有一個 GC Roots蜕提。
被 GC Roots 引用的對象就不會被垃圾回收。GC Roots 指的是局部變量靶端,或者類的靜態(tài)變量谎势。具體可以看這篇文章:什么是被 GC Roots 直接引用的對象?杨名。
其次脏榆,看引用類型。Java中有強引用台谍、軟引用须喂、弱引用和虛引用:
- 強引用,被強引用的對象不會被回收
- 軟引用趁蕊,被軟引用的對象一般并不會被回收坞生,GC之后內(nèi)存任然不夠會被回收
- 弱引用,弱引用就像沒有被引用掷伙,GC時直接回收
- 虛引用是己,很少用到需引用,可以忽略
所以總的來說:
- 有 GC Roots 的對象不能回收任柜,沒有 GC Roots 的對象可以回收
- 有 GC Roots 的對象赃泡,如果是軟引用或者弱引用寒波,也有可能被回收
最后乘盼,一個對象沒有被 GC Roots 引用升熊,是否立即就會被回收呢?
也不一定立即被回收绸栅,該類可以重寫finialize()
方法级野,在finialize()
中讓一個 GC Roots 重新引用這個對象,就能自救粹胯。