关注
二、为什么不是1个 Survivor 空间?
回答这个问题有一个前提,就是新生代一般都采用复制算法进行垃圾收集。原始的复制算法是把一块内存一分为二, gc 时把存活的对象从一块空间(From space)复制到另外一块空间(To space),再把原先的那块内存(From space)清理干净,最后调换 From space 和 To space 的逻辑角色(这样下一次 gc 的时候还可以按这样的方式进行)。
我们知道,在 HotSpot 虚拟机里, Eden 空间和 Survivor 空间默认的比例是 8:1 。我们来看看在只有一个 Survivor 空间的情况下,这个 8:1 会有什么问题。此处为了方便说明,我们假设新生代一共为 9 MB 。对象优先在 Eden 区分配,当 Eden 空间满 8 MB 时,触发第一次 Minor GC 。比如说有 0.5 MB 的对象存活,那这 0.5 MB 的对象将由 Eden 区向 Survivor 区复制。这次 Minor GC 过后, Eden 区被清理干净, Survivor 区被占用了 0.5 MB ,还剩 0.5 MB 。到这里一切都很美好,但问题马上就来了:从现在开始所有对象将会在这剩下的 0.5 MB 的空间上被分配,很快就会发现空间不足,于是只好触发下一次 Minor GC 。可以看出在这种情况下,当 Survivor 空间作为对象“出生地”的时候,很容易触发 Minor GC ,这种 8:1 的不对称分配不但没能在总体上降低 Minor GC 的频率,还会把 gc 的时间间隔搞得很不平均。把 Eden : Survivor 设成 1 : 1 也一样,每当对象总大小满 5 MB 的时候都必须触发一次 Minor GC ,唯一的变化是 gc 的时间间隔相对平均了。
上面的论述都是以“新生代使用复制算法”这个既定事实作为前提来讨论的。如果不是这样,比如说新生代采用“标记-清除”或者“标记-整理”算法来实现幸存对象的移动,好像确实是只需要一个 Survivor 就够了。至于主流的虚拟机实现为什么不考虑采用这种方式,我也不是很清楚,或许有实现难度、内存碎片或者执行效率方面的考虑吧。
查看原帖
3 评论
相关推荐
05-15 13:31
杭州电子科技大学 Java 点赞 评论 收藏
分享
牛客热帖
更多
- 1... 6月18日,我将站上法庭,正式起诉美团。我送出的每一单快件,都是我人生碎片的一部分。我会一直前进,拿回在海外SaaS失去的一切。5.9W
- 2... 研一快手后端开发,一周速通,附一二面面经1.2W
- 3... 毕业一年在回到学校的感觉真不一样1.1W
- 4... 挚文集团-陌陌笔试202506068470
- 5... 25校招 双非硕 拿下大厂🐧7880
- 6... 秋招和考公两手抓的不完全攻略7377
- 7... 乡下人第一次到上海租房,隔壁sexy声音搞的我火气很大4623
- 8... 金山办公测试春招一面_珠海4213
- 9... 26学院本游戏客户端鼠鼠求职碎碎念+总结3972
- 10... 主包租房的经验总结!3940
正在热议
更多
# 我的实习收获 #
34403次浏览 522人参与
# 安利/避雷我的专业 #
73626次浏览 515人参与
# 实习吐槽大会 #
37779次浏览 175人参与
# 我在牛爱网找对象 #
186403次浏览 1402人参与
# 晒一晒你的工位 #
87019次浏览 309人参与
# 你后悔选择现在的专业吗 #
81923次浏览 672人参与
# 你觉得专业和学校哪个对薪资影响最大 #
58064次浏览 472人参与
# 求职遇到的搞笑事件 #
113574次浏览 772人参与
# 移动求职进展汇总 #
1680次浏览 17人参与
# 2025牛客秋招季 #
6062次浏览 191人参与
# 机械人与华为的爱恨情仇 #
113356次浏览 938人参与
# 双非能在秋招上岸吗? #
215491次浏览 1150人参与
# 我的租房踩坑经历 #
33037次浏览 336人参与
# 第一份工作应该选高薪还是热爱? #
61736次浏览 562人参与
# 26届秋招投递记录 #
4783次浏览 127人参与
# 我的国央企投递进展 #
43145次浏览 268人参与
# 穿越回高考你还会选现在的专业吗 #
24460次浏览 284人参与
# 牛友们,签完三方你在忙什么? #
95167次浏览 841人参与
# 地方国企笔面经互助 #
30013次浏览 99人参与
# 招银网络求职进展汇总 #
113331次浏览 742人参与