首页 > 代码库 > 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-垃圾收集器