GC - 垃圾收集器比较

新生代收集器 + 老年代收集器

一、Serial 收集器

串行收集,STW 时间长。

新生代:复制算法
老年代:标记整理算法


JVM_GC-Serial-Operation-Diagram

二、ParNew 收集器

只负责新生代垃圾回收,采用复制算法。

相对于 Serial 收集器,GC 线程由串改并。


JVM_GC-ParNew-SerialOld-Operation-Diagram

三、Parallel Scavenge 收集器

新生代垃圾收集器,采用复制算法。

目标:达到一个可控制的吞吐量。吞吐量优先收集器。

-XX:GCTimeRatio:设置吞吐量大小。范围:0-100,垃圾收集时间占总时间的比率。
-XX:MaxGCPauseMillis:控制最大垃圾收集停顿时间。

-XX:+UseAdaptiveSizePolicy:开关参数,激活后,不需要人工指定新生代大小、Eden和Survivor区的比例、晋升老年代对象大小等细节参数,虚拟机会根据系统运行情况收集性能监控信息,动态调整这些参数以提高最合适的饿停顿时间或者最大的吞吐量。(自适应调节)

四、Parallel Old 收集器

Parallel Scavenge 收集器的老年代版本,支持多线程并发收集,采用标记-整理算法实现。


JVM_GC-Parallel-Scavenge-ParallelOld-Operation-Diagram

五、CMS 收集器

以获取最短回收停顿时间为目标的收集器,采用并发“标记-清除”算法。

整个过程分为四个步骤:

  1. 初始标记(需要STW)
  2. 并发标记
  3. 重新标记(需要STW)
  4. 并发清除
    JVM_GC-CMS-Mark-Sweep-Operation-Diagram

    CMS 必须预留一部分空间供并发收集时的程序运行,JDK 6时,当老年代使用了 92% 后,CMS 收集器就会被激活。
    如果CMS 运行期间预留的内存无法满足程序分配新对象的需要,就会出现一次“并发失败”,这时会启用后备预案:冻结用户线程的执行,临时启用 Serial Old 收集器来重新进行老年代的垃圾收集。

-XX:CMSInitiatingOccupancyFraction:设置触发 CMS 的百分比。 -XX:+UseCMSCompactAtFullCollection:开关参数,控制 CMS 收集器进行 Full GC 时进行内存碎片的合并整理。JDK 9后废弃。
-XX:CMSFullGCsBeforeCompaction:要求CMS 收集器在执行过若干次不整理空间的 Full GC 之后,下一次进入 Full GC 前会先进行碎片整理。0 表示每次都整理。

优点:并发收集、低停顿。

缺点:

  1. 对处理器资源非常敏感。
  2. 无法清除“浮动垃圾”。
  3. 内存碎片问题。

六、G1 收集器

全年代收集器。支持大内存,保证 GC 低延迟。


JVM_GC-Generational-Partition

Region 中有一类特殊的 Humongous 区域,专门用来存储大对象。G1 认为只要大小超过一个 Region 容量一般的对象即可判定为大对象。

每个 Region 的大小可以通过参数 -XX:G1HeapRegionSize 设定,取值范围为 1MB ~ 32MB,且应为 2 的N次幂。

  1. 逻辑空间连续,物流空间不一定连续。
    堆被分成多个大小的区域,映射为不连续的 eden、Survivor 和 old。
  2. 可预期的停顿时间。
  3. 无内存碎片,采用标记-整理算法。
  4. YGC 一次STW(复制),Mixed GC 四次STW(初始标记、重新标记、清理、复制)
  5. 停顿时间瓶颈在复制上,未能在转移过程中准确定位对象地址。
  6. 无法在堆中申请新的分区时,执行 STW 的单线程 Full GC。


    JVM_GC-G1-Operation-Diagram

RSet

一种 points-in 结构,在卡表基础上实现,每个 heap 分区(region)一个,用来记录别的 region 指向自己的指针,并标记这些指针在卡表哪些范围内(谁指向我)。
key:引用的 region 地址,value:引用的对象卡页集合。

存活对象用 RSet 标识,GC 时不用扫描整个堆。

YGC

选定 young generation region 的 RSet 作为根集,这些 RSet 记录了 old-young 的跨代引用,避免扫描整个 old generation。

年轻代复制存活对象到新的 Survivor。

Mixed GC

old generation 记录了 old-old 的 RSet,young-old的引用扫描全部由 young generation region 得到,也不用 扫描全部 old generation。

  1. 并行标记清除不可达 old,复制活跃的 young 和 old。
  2. 标记清除 old,复制 young 和 old。

region 回收价值

对象存活率、回收预计耗时,回收效果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容