深入理解 Java 虚拟机读书笔记3

垃圾回收器

基于垃圾回收算法理论,不同的虚拟机会有不同的实现,以下仅就 HotSpot 虚拟机进行的分类:

  • Serial
    虚拟机运行在 Client 模式下的默认新生代回收器,简单高效是它的优点,但在进行 GC 操作时,必须要停止所有工作线程。
    与之对应的老年代回收器是 Serial Old
  • ParNew
    这是多线程版本的 Serial,默认开启的回收线程数是 CPU 数量。考虑到除了 Serial 外,它是唯一能与 CMS 配合工作的回收器,所以 Server 模式下大概率会首选它作为新生代回收器。
  • Parallel Scavenge
    与前面的回收器不同的是,它从「吞吐量」的角度来实现垃圾回收的最优解。适用于 Server 模式下大量运算的新生代回收。通过 MaxGCPauseMillis 和 GCTimeRatio 可对吞吐量进行控制,而除了手动设置外,Parallel Scavenge 也可动态调整,这也是和 ParNew 的主要区别之一。
    与之对应的老年代回收器是 Parallel Old,要注意的是,一般选用 Parallel Scanvenge 就要与 Parallel Old 搭配。
  • CMS(Concurrent Mark Sweep)
    其目标是获取最短回收停顿时间,适用于响应速度快,保障用户良好体验的场景。默认的回收线程数是(CPU数量 + 3)/ 4。其回收过程分为:
    1.初始标记。需要短暂停顿
    2.并发标记
    3.重新标记。需要短暂停顿
    4.并发清除
    除 1,3 过程需要停顿外,并发标记和清除可与工作线程并发操作,从而实现你回收你的,我做我的。
    不过,对于 CMS,其缺点是 1.效率会受 CPU 数量不同而有所变化;2.在回收时产生的垃圾无法再回收;3.回收后会产生空间碎片。
  • G1(Garbage-First)
    G1 的诞生是在未来的某一天替换 CMS 的,其具备的优点有:
    1. 并行与并发。本质上还是围绕缩短停顿时间做的调整和优化。
    2. 分代回收。它不像其他回收器需要区分新生代还是老年代,G1 可以自己管理整个 Java 堆,而且针对不同的对象(指的是生存的时间长短)采用不同的方式管理。它将 Java 堆分为了各个 Region,对各 Region 进行垃圾回收价值跟踪。
    3. 空间整合。即不像 CMS 那样,回收完之后空间会是整块的。
    4. 可预测的停顿。做到一段时间片段内,停顿不超过多少的耗时可控,这也是和 CMS 的重要区别之一。

你可能感兴趣的:(深入理解 Java 虚拟机读书笔记3)