java GC 循序渐进100 问 - 2. 算法与实现

前言

本节会分类介绍下垃圾回收算法, 垃圾回收器的优点和缺点

先在脑中有个大致的框架

本节自测问题

  1. GC 回收算法有哪些 ? 有什么优点/缺点

    • 提示: 一共 3个算法 + 一个思想
  2. 这些算法对应的回收器实现有哪些 ?

    • 新生代 / 老年代 / all
  3. Parallel Scavenge 与 Parallel New 的区别

    • 至少 3点 (参见: 其他问题)
  4. CMS 的4个阶段

  5. CMS 的缺点

    • 至少 3 点
  6. G1GC 的特点

    • 至少 3 点
  7. 吞吐量优先/延迟优先下, 分别选用哪个(些) 垃圾回收器?

  8. 其他问题

    • 为什么 Parallel Scanvenge 不能和 CMS 一起用 ?
    • Parallel Scanvenge 和 ParNew(Parallel New) 的区别
    • Parallel 和 Concurrent 用在垃圾回收器中分别是什么含义:

GC 算法

回收算法 优点 缺点
Mark-Sweep 标记清除 不需要移动对象, 简单高效 会产生内存碎片
Copying 复制 简单高效, 没有内存碎片 内存使用率低, 可能会产生内存频繁复制的情况
Mark-Compact 标记整理 简单高效, 没有内存碎片, 内存使用率高 仍需要移动对象
Generational Collection 分代收集算法(思想) 分区回收, 基于大多数对象生命周期较短的假设 对长时间存活对象的场景效果不佳

垃圾回收器

新生代回收器

回收器名 回收算法 特点
Serial Copying 单线程回收器
Parallel New Copying Parallel New 可以看成 Serial 的多线程版本, 可以和 CMS 一起使用
Parallel Scavenge Copying 1. Parallel Scavenge 和 Parallel New 类似,但更加注重吞吐率。2. Parallel Scavenge 不能与 CMS 一起使用。3.Parallel Scavenge 有自适应调节策略+XX:UseAdaptiveSizePolicy, 调节新生代大小, eden/survivor 比例, 晋升老年代年龄等

老年代回收器

回收器名 回收算法 特点
Serial Old Mark-Compact 单线程
Parallel Old Mark-Compact 多线程回收
CMS - concurrent mark & sweep Mark-SWEEP 并发低延迟,CPU占用高, 在 java9 中被弃用

其他回收器

回收器名 回收算法 特点
G1 Copying & Mark-Compact 1. 分区, 优先回收死亡对象较多的区域 2. 不需要其他收集器配合就能独立管理整个堆 3. 高并发, 低延迟, 可预测停顿时间
ZGC Mark-Compact 1. 可变分区大小, 低延迟, 通过LVB 实现低延迟

Parallel Scavenge

Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。

  • MaxGCPauseMillis 参数允许的值是一个大于0的毫秒数,收集器将尽可能地保证内存回收花费的时间不超过设定值
  • GCTimeRatio参数的值应当是一个大于0且小于100的整数

CMS

CMS 的 4个阶段

  • 初始标记 STW
    • 标记gc roots直接关联到的对象
  • 并发标记
    • gc tracing
  • 重新标记 STW
    • 修正并发标记阶段因为用户程序继续运行而导致的标记变动
    • 时长远远比并发标记的时间短
  • 并发清除
    • 与用户线程一起运行

CMS 的缺点

  1. 对CPU资源敏感, 在cpu不足4个时, 对用户线程影响大
  2. cms 在并发清除的过程中, 仍然有新的垃圾不断产生 (这部分垃圾被称为浮动垃圾 floating garbage), 所以需要事先预留一定区域(相当于浪费一部分内存), 否则如果垃圾回收时, 内存不足会导致 concurrent mode failure, 并使用 serial old 来回收垃圾了.
  3. mark-sweep 的算法容易导致内存碎片产生
    • -XX:+UseCMSCompactAtFullCollection 在 fullGC的时候开启内存碎片整理, 但这个过程无法并发
    • -XX:CMSFullGCsBeforeCompaction 设置执行多少次不压缩的 full gc 之后, 进行一次 compact

选优

  • 吞吐量优先
    • Parallel Scavenge + Parallel Old
      • -XX:+UseParallelOldGC
    • Parallel New(ParNew) + CMS (cpu敏感,较低延迟)
      • -XX:+UseConcMarkSweepGC
      • cms 在并发模式回收失败的情况下, 会使用 serial old GC
  • 低延迟
    • G1GC
      • -XX:+UseG1GC
    • ZGC

下图来自于 ①

https://raw.githubusercontent.com/giraffe-tree/Doc/master/java-new/jvm/gc/blog/asset/java_gc_100_quesions_2/collectors.jpg

其他问题

为什么 Parallel Scanvenge 不能和 CMS 一起用?

R大回答: https://hllvm-group.iteye.com/group/topic/37095#post-242695

这些XXXGeneration都在HotSpot VM的“分代式GC框架( Generational GC framework )”内。本来HotSpot VM鼓励开发者尽量在这个框架内开发GC,但后来有个开发就是不愿意被这框架憋着,自己硬写了个没有使用已有框架的新并行GC,并拉拢性能测试团队用这个并行GC来跑分,成绩也还不错,于是这个GC就放进HotSpot VM里了。这就是我们现在看到的ParallelScavenge。

Parallel Scanvenge 和 ParNew(Parallel New) 的区别

R大回答: https://hllvm-group.iteye.com/group/topic/37095#post-242695

1、PS以前是广度优先顺序来遍历对象图的,JDK6的时候改为默认用深度优先顺序遍历,并留有一个UseDepthFirstScavengeOrder参数来选择是用深度还是广度优先。在JDK6u18之后这个参数被去掉,PS变为只用深度优先遍历。ParNew则是一直都只用广度优先顺序来遍历
2、PS完整实现了adaptive size policy,而ParNew及“分代式GC框架”内的其它GC都没有实现(倒不是不能实现,就是麻烦+没人力资源去做)。所以千万千万别在用ParNew+CMS的组合下用UseAdaptiveSizePolicy,请只在使用UseParallelGC或UseParallelOldGC的时候用它。
3、由于在“分代式GC框架”内,ParNew可以跟CMS搭配使用,而ParallelScavenge不能。当时ParNew GC被从Exact VM移植到HotSpot VM的最大原因就是为了跟CMS搭配使用。
4、在PS成为主要的throughput GC之后,它还实现了针对NUMA的优化;而ParNew一直没有得到NUMA优化的实现。

Parallel 和 Concurrent 用在垃圾回收器中分别是什么含义:

Parallel 多条垃圾回收线程同时工作, 但用户线程处于等待状态

  • 如 ParNew Old

Concurrent 指用户线程与垃圾回收线程同时执行

  • 如 CMS

来自②深入理解 jvm 周志明 3.5.2 ParNew 收集器 P78

参考

  • ① Our Collectors - Jon Masamitsu's Weblog

  • ② 深入理解 jvm 周志明

  • ③ zgc

    • 与标记对象的传统算法相比,ZGC在指针上做标记,在访问指针时加入Load Barrier(读屏障),比如当对象正被GC移动,指针上的颜色就会不对,这个屏障就会先把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速,而不存在为了保持应用与GC一致而粗暴整体的Stop The World。

    • https://www.jianshu.com/p/60d9e125dcf3

转载请注明出处

作者: GiraffeTree - https://giraffetree.me/2019/10/13/java_gc_100_quesions_2/

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

推荐阅读更多精彩内容