前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM-垃圾收集器

JVM-垃圾收集器

作者头像
小小科
发布2018-05-02 17:56:48
4780
发布2018-05-02 17:56:48
举报
文章被收录于专栏:北京马哥教育北京马哥教育

本篇主要介绍一下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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马哥Linux运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档