本文共 1645 字,大约阅读时间需要 5 分钟。
JVM虚拟机中如何进行内存回收,是由虚拟机所采用的GC收集器有关,目前为止,没有最好的垃圾收集器的说法,只有根据具体应用选用最合适的垃圾收集器。
主要分为7大类:
(1)Serial收集器
特点:单线程收集器,在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束,适合于单个CPU环境。
参数设置:
JVM运行在Clinet模式下的默认收集器,设置如下参数:
-XX:+UseSerialGC
则使用:Serial + Serial Old 的收集器组合进行内存回收。
(2)ParNew收集器
特点:Serial收集器的多线程版本
参数设置:
设置如下参数:
-XX:+UseParNewGC
则使用:ParNew + Serial Old 的收集器组合进行内存回收。
(3)ParallelScavenge 收集器
特点:达到一个可控制的吞吐量(Throughput)。所谓吞吐量,指的是CPU用于运行代码的时间与CPU总消耗时间的比值。即:吞吐量 = 运行用户代码时间/(运行用户代码时间 + 垃圾收集时间),比如,虚拟机总共运行花了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。(吞吐量优先收集器)
参数设置:
JVM运行在Server模式的默认收集器,设置如下参数:
-XX:+UseParallelGC
则使用:Parallel Scavenge + Serial Old(PS MarkSweep)的收集器组合进行内存回收。
(4)SerialOld 收集器
特点:Serial收集器的老年代版本,是一个单线程收集器(无法充分利用服务器多核CPU的处理能力)。在Client模式下,作为Serial收集器的老年代使用。在Server模式下,可以与Parallel Scavenge收集器配合使用。
(5)ParallelOld 收集器
特点:Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。以前新生代如果选择了Parallel Scavenge,则老年代收集器只能使用Serial Old,而Serial Old在服务端性能不佳,导致Parallel Scavenge的吞吐量收到影响。
如果注重高吞吐量和对CPU资源利用率,优先考虑Parallel Scavenge + Parallel Old收集器。
参数设置:
设置如下参数:
-XX:+UseParallelOldGC
则使用:Parallel Scavege + Parallel Old的收集器组合进行内存回收。
(6)CMS收集器
特点:CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间的收集器。
应用场合:互联网网站或者B/S系统的服务端上(重视:服务器响应速度,希望停顿时间短,给用户较好的体验)。
参数设置:
-XX:+UseConcMarkSweepGC
则使用:ParNew + CMS + Serial Old 的收集器组合进行内存回收。
注意:这里有两个老年代收集器CMS和Serial Old,Serial Old 收集器作为CMS收集器出现Concurrent Mode Failure失败后的备用老年代收集器使用。
(7)G1收集器
特点:G1 是一种面向服务端应用的垃圾收集器,追求低停顿。G1 发布时间短,还没有经过实际的应用考验。追求低停顿,CMS 和 G1相比,CMS 仍然是首选的。
参数设置:
-XX:+UseG1GC
总结:
1、使用Parallel Scavenge + Parallel Old收集器,设置参数如下:
-XX:+UseParallelGC
-XX:+UseParallelOldGC
2、使用ParNew + CMS + Serial Old 收集器
-XX:+UseConcMarkSweepGC
上述,各个垃圾收集器的关系如下图,其中,连线表示可以组合使用。