Hotspot VM的实现
- OopMap:在类加载完成后记录下对象内的数据类型与偏移量,在JIT编译过程中记录下栈和寄存器中哪些位置是引用。
- 安全点:在指令序列复用时,如方法调用,循环跳转,异常跳转等。
- 中断:
- 抢先式中断:不需要线程代码配合,当GC发生时,先把所有线程都中断,如果发现线程中断的点不在安全点上,则恢复线程,让他跑到安全点上。
- 主动式中断:当GC需要中断线程的时候,在安全点上设置中断标志,线程执行时主动轮询中断标志,发现标志为真时则主动中断挂起线程。
- 安全区域:指线程在某一段代码片段中,引用关系不会发生变化,在这个区域中的任意点开始GC都是安全的。在线程处于blocked或sleep状态无法跑到安全点时,采用安全区域可以避免GC长时间等待。
垃圾收集器
- Serial收集器:单线程,进行垃圾收集时必须暂停所有工作线程。Client模式下默认新生代收集器。采用复制算法。优点:简单高效,进行垃圾收集时不需要与工作线程交互。缺点:必须暂停所有工作线程,停顿时间较长。
- Serial Old收集器:Serial收集器的老年代版本。主要也是在Client模式下使用,在Server模式下,主要与Parallel Scavenge收集器搭配使用,或作为CMS收集器的后备预案。采用标记-整理算法。
- ParNew收集器:Serial收集器的多线程版本,除了能够多线程进行垃圾收集以外,其他与Serial收集器相似,进行垃圾收集时必须暂停所有工作线程。Server模式下默认新生代收集器。采用复制算法。在CPU核心数量较多的时候垃圾收集效率较高,但在CPU核心数量较少的时候效率不一定比Serial收集器高。
- Parallel Scavenge收集器:与ParNew类似,也是多线程收集器,但更关注于达到一个可控制的吞吐量(用于执行用户代码的CPU时间与CPU总消耗时间的比值)。采用复制算法。
- Parallel Old收集器:Parallel Scavenge的老年代版本。采用标记-整理算法。
- CMS收集器:并发收集器,追求最短回收停顿时间,适合追求服务响应速度的服务端应用。采用标记-清除算法。优点:收集过程中耗时最长的步骤都可以和用户工作线程并发工作。缺点:对CPU资源非常敏感,在CPU核心数较少的情况下,对应用的运行速度有较大影响;无法处理浮动垃圾,即在垃圾收集过程中总有新的垃圾不断产生,只能积累到下一次GC再收集;标记-清除算法容易导致产生大量内存碎片,从而提前触发Full GC。
- G1收集器:并行与并发;分代收集;空间整合;可预测的停顿。使用Region划分GC堆。