关于JVM 的GC收集器

来源:互联网 发布:代理商查询系统源码 编辑:程序博客网 时间:2024/06/02 06:01

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

上述,各个垃圾收集器的关系如下图,其中,连线表示可以组合使用。


原创粉丝点击