GC 的机制是什么?垃圾回收器的基本原理是什么?是否可以立即回收内存?怎么样主动的通知 JVM 进行垃圾回收?
GC 的目标,是在 GC Root 链之外的所有对象,GC Roots 是可达性分析算法的回收目标。GC Root 对象如下:
可达性分析时,需要找 GC Roots 的引用链。为了保证 GC Roots 状态的一致性,整个分析 GC Roots 引用链的过程就像是冻结了时间一样,即 Stop the world。 Stop the world 时,JVM 使用 OopMap 记录哪些地方存放着对象引用。由于为了权衡 OopMap 的大小与数量(如果 OopMap 数量过多,会比较频繁的出现 GC,如果 OopMap 大小过大,每次的 GC 时间会过长),所以 HotSpot JVM 在特定的位置记录 OopMap,这些特定的位置称为安全点 (SafePoint)。 GC 开始时需要中断线程,各个线程开始主动轮询一个中断标志,这个中断标志和一个安全点是重合的。各线程轮询时发现中断标志为真,就自己中断挂起。此外,对于处于 sleep, blocked 状态的线程,在进入 sleep, blocked 状态时,就会标注自己处于一个安全区域。对于处于安全区域的线程,不会参与前面所说的中断标志位的轮询过程。
引用的区分:
对于方法区,类很少会被回收,或者说类被回收的条件很苛刻:
注:垃圾回收基本原理见前面《JVM技术总结之一——JVM调优》。