这是一个单线程的垃圾接纳器,在进行垃圾接纳时会停息所有用户线程(“Stop The World”)。它的优点是简单高效,对于单 CPU 环境大概小型应用来说,由于没有线程切换的开销,性能体现不错。适用于客户端模式下的 JVM,例如一些简单的桌面应用步伐。
ParNew 接纳器
是 Serial 接纳器的多线程版本,在新生代接纳复制算法进行垃圾接纳。它能够充分利用多 CPU 的优势,提高垃圾接纳的服从。通常与 CMS 接纳器配合利用,在新生代利用 ParNew 接纳器,老年代利用 CMS 接纳器,适用于多 CPU 环境下的服务器应用。
Parallel Scavenge 接纳器
也是一个新生代垃圾接纳器,接纳复制算法。它的特点是关注系统的吞吐量,即单元时间内 CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值。通过参数可以精确控制吞吐量的大小,适合在背景运算而不需要太多交互的任务,例如一些科学计算、数据处置惩罚等批处置惩罚任务。
Serial Old 接纳器
Serial 接纳器的老年代版本,是一个单线程的、接纳标记 - 整理算法的垃圾接纳器。重要用于在客户端模式下与 Serial 接纳器搭配利用,大概在服务端模式下作为 CMS 接纳器的后备预案,在并发收集发生 “Concurrent Mode Failure” 时利用。
Parallel Old 接纳器
以获取最短接纳停顿时间为目标的垃圾接纳器。它的工作过程比力复杂,重要分为四个阶段:初始标记、并发标记、重新标记和并发扫除。初始标记和重新标记阶段仍然需要停息所有用户线程,但时间很短;并发标记和并发扫除阶段与用户线程并发实验,大大淘汰了垃圾接纳时应用的停顿时间。适用于对相应时间要求较高的应用,如 Web 服务器等。但它也有一些缺点,例如会产生内存碎片,并且在并发阶段会占用肯定的 CPU 资源,影相应用的团体性能。
G1 接纳器(Garbage First)
面向服务端应用的垃圾接纳器,重要应用在多 CPU 和大内存的环境下。它将堆内存分别为多个大小相等的 Region,在进行垃圾接纳时,优先接纳垃圾最多的 Region。G1 接纳器接纳了标记 - 整理算法,避免了内存碎片问题,同时能够预测垃圾接纳的停顿时间,通过参数可以指定一个期望的停顿时间,让垃圾接纳在不影相应用相应时间的条件下进行。适用于大型的分布式系统、数据处置惩罚应用等对内存和相应时间都有较高要求的场景。
四、垃圾接纳的调优策略
根据应用的范例、性能要求等因素选择符合的垃圾接纳器。例如,如果是对相应时间敏感的 Web 应用,可能优先考虑 CMS 接纳器或 G1 接纳器;如果是注重吞吐量的批处置惩罚应用,则可以选择 Parallel Scavenge 接纳器与 Parallel Old 接纳器的组合。
调整堆内存大小
公道设置新生代和老年代的大小。一样平常来说,可以根据应用中对象的生命周期特点进行调整。如果新生代设置过小,会导致频繁的 Minor GC;如果老年代设置过小,容易引发 Full GC。可以通过参数 -Xms(初始堆大小)和 -Xmx(最大堆大小)来设置堆内存的初始值和最大值,以及 -Xmn 来设置新生代的大小。
控制对象晋升到老年代的年龄
对象在新生代中经过多次 Minor GC 后仍然存活,就会晋升到老年代。可以通过参数 -XX:MaxTenuringThreshold 来调整对象晋升到老年代的年龄阈值,根据应用中对象的存活环境进行优化,避免过早或过晚地将对象晋升到老年代。
优化 CMS 接纳器