首页 > 代码库 > JVM-垃圾收集器
JVM-垃圾收集器
本篇主要介绍一下JVM的几种垃圾收集器。其示意图如下所示,上面的三个是新生代的收集器,下面三个是老年代的收集器,其中G1收集器是可以用于新生代和老年代的收集工作。
JVM垃圾收集器
1、Serial(串行收集器):用于新生代GC,复制算法,启动时默认为Client模式,GC的线程为单线程。缺点是因为单线程GC,会造成中断的时间(Sop-the-world)比较大。(对于单核的CPU来说,比并行收集的效率要高)其示意图如下所示:
Serial串行收集器
2、ParNew(并行收集器):与Serial类似,不同点在于它一般用于新生代的并行回收,而且通常情况下运行在Server模式(单核CPU下,性能可能比Serial还要差)。示意图如下所示:
ParNew并行收集器
3、Parallel Scavenge(并行回收):用于新生代回收,复制算法,并行收集。与ParNew的不同是它的关注点不同,它可以精确的控制吞吐量。【吞吐量= 程序运行时间/(程序运行时间 + 垃圾收集时间),例如:JVM共运行了100min。其中垃圾收集花掉1min,那吞吐量就是99%】示意图如下所示:
Parallel Scavenge并行收集
4、Serial Old(串行收集器):是Serial收集器的老年代版本,使用标记-压缩(标记-整理)收集算法,主要用于启动模式为Client的JVM。示意图可以参考Serial串行收集器。
5、Parallel Old(并行收集器):是Parallel的老年代版本,使用标记-压缩(标记-整理)收集算法。其示意图可以参考Parallel并行收集。
6、CMS(concurrent mark sweep):并发收集器(发生GC时,GC线程与应用线程同时运行)。是一种以最短响应为目标的收集器,适用于B/S架构的运行环境。使用标记-清除算法,因此会产生大量的内存碎片。CMS的收集大概可以分为一下几个步骤:【初始标记 initial mark】--->【并发标记 concurrent mark】--->【重新标记 remark】--->【并发清除 concurrent sweep】。其示意图如下所示:
CMS并发收集器
7、G1收集器:是一款面向服务端的收集器,未来有可能替代CMS收集器。G1收集器具备以下特点:
a、并发与并行:能充分利用多核CPU的硬件特性来缩短停顿时间(Stop-the-world),可以与应用线程一同运行。
b、分带搜集:与其他收集器一样,分代的概念在G1中也存在。G1可以自己独立的去管理GC,它能够采用不同的方式去处理不同存活时间的对象。
c、空间整合:从整体上看G1使用的是标记-压缩(整理)的GC算法。这就意味着在JVM运行的时候不会产生大量的内存碎片,从而可以让程序长时间的运行。
d、可预测的停顿:与CMS相比,G1除了可以有更短的停顿时间之外,还可以建立可预测的停顿时间模型。
不计算Remembered Set的操作,G1收集器的运作大概可以分为以下几个步骤:【初始标记 initial marking】--->【并发标记 concurrent marking】--->【最终标记 final marking】--->【筛选回收 live data counting and evacuation】
G1并发并行收集
GC参数总结
-XX:+<option> 启用选项
-XX:-<option> 不启用选项
-XX:<option>=<number>
-XX:<option>=<string>
- -XX:+UseSerialGC:在新生代和老年代使用串行收集器
- -XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
- -XX:NewRatio:新生代和老年代的比
- -XX:+UseParNewGC:在新生代使用并行收集器
- -XX:+UseParallelGC :新生代使用并行回收收集器
- -XX:+UseParallelOldGC:老年代使用并行回收收集器
- -XX:ParallelGCThreads:设置用于垃圾回收的线程数
- -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
- -XX:ParallelCMSThreads:设定CMS的线程数量
- -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
- -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
- -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
- -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
- -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
- -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
GC参数组合
GC参数------------------------------------------------------------------Young------------------------tenured
====================================================================
-XX:+UseSerialGC----------------------------------------------------Serial-------------------------Serial Old
-XX:+UseParallelGC--------------------------------------------------Parallel Scavenge -------Serial Old
-XX:+UseConcMarkSweepGC-------------------------------------ParNew----------------------CMS
-XX:+UseParNewGC-------------------------------------------------ParNew----------------------Serial Old
-XX:+UseParallelOldGC---------------------------------------------Parallel Scavenge---------Parallel Old
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC--------Serial--------------------------CMS
-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC-------G1-----------------------------G1
JVM-垃圾收集器