学习JVM原理-3. 什么对象可被GC? 何时GC?

摘自《深入理解Java虚拟机》周志明著

对象能否被GC,是根据对象关联图来决定的 (图论里的“图”)

JVM会维持一张图,这个图里有些“根”结点,
如果从根到某个对象之间没有路径,则这个对象可以被GC.

这些根结点称作GC Roots,这种判断算法称作GC Roots Tracing

Method Areas中的常量池的常量能否被GC,也是基于相同的原则; 至于Method Areas中的类,则要满足实例已回收、ClassLoader已回收和Bean.class对象未被引用等三个条件

不过,对象被判定未被引用之后并不会立即判死刑,它只会被放到一个队列中,系统会执行队列中每个对象的finalize()方法,在finalize()方法中对象可以把自己关联给别的对象,这样它就能逃出生天。然而,覆盖finalize()方法本身是不良的实践,应尽量避免。

对象被判死刑后并不意味着会立即执行,这取决于GC的调度算法,有的情况会频繁一些,有的则少一些,这取决于你使用的GC策略和当前的内存情况。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.