jvm调优-收集器的选择

Serial、Serial Old
正如名字一样,是串行的收集器,分别对应新生代和老年代的收集器。会『stop the world』。
用于单CPU机器,避免线程交互的开销;或者client模式下的虚拟机。

ParNew
用于新生代,是serial的多线程版本,与serial共用了大量代码。
可以与CMS配合使用。

Parallel Scavenge
用于新生代,采用复制算法。
目的是达到一个可控制的吞吐量。高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
也被称为『吞吐量优先』的收集器。提供两个参数用于控制吞吐量,最大垃圾收集停顿时间(-XX:MaxGCPauseMillis)和吞吐量大小(-XX:GCTimeRatio)。
-XX:+UserAdaptiveSizePolicy是一个开关参数,打开后,无需在设置晋升老年代年龄(-XX:PretenureSizeThreshold)等参数。设置吞吐量相关的参数,jvm会自适应调节。

Parallel Old 
Parallel Scavenge的老年代版本。使用『标记-整理』算法。
在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old。

CMS
目标是获取最短回收停顿时间。GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的。把新生代调小,收集更快,停顿变小,但是频率增加。导致单位时间内,用于垃圾回收的时间增加,吞吐量变小。适合与用户交互的程序。

G1
Garbage First。
并行与并发,分代收集。采用『标记-整理』,相对于CMS的『标记-清理』,不会产生内存空间碎片。
可预测的停顿。
将整个java堆划分为多个大小相等的独立区域(Region)。G1跟踪各个Region的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表。每次根据允许的收集时间,优先回收价值最大的Region,这也是Garbage First的由来。

猜你喜欢

转载自blog.csdn.net/daimingyang123/article/details/80101325
今日推荐