关注
二、为什么不是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 评论
相关推荐
s8x:学会了,标题带上找人改简历xx钱,流量密码😂
投递哔哩哔哩等公司10个岗位
点赞 评论 收藏
分享
牛客热帖
正在热议
# 25届秋招总结 #
316927次浏览 2913人参与
# 上班苦还是上学苦呢? #
66667次浏览 553人参与
# 阿里云管培生offer #
35355次浏览 419人参与
# 地方国企笔面经互助 #
4253次浏览 12人参与
# 如果有时光机,你最想去到哪个年纪? #
19630次浏览 318人参与
# 选完offer后,你后悔学本专业吗 #
21101次浏览 151人参与
# 百度开奖 #
176383次浏览 1104人参与
# 如何一边实习一边秋招 #
994756次浏览 12651人参与
# 招聘要求与实际实习内容不符怎么办 #
10593次浏览 276人参与
# 学历or实习经历,哪个更重要 #
52865次浏览 414人参与
# 海康威视求职进展汇总 #
400002次浏览 3406人参与
# 正在实习的你,几点下班 #
52767次浏览 394人参与
# 国央企薪资爆料 #
10621次浏览 76人参与
# 租房前辈的忠告 #
109236次浏览 5232人参与
# 软开人,秋招你打算投哪些公司呢 #
43735次浏览 544人参与
# 得物求职进展汇总 #
67056次浏览 686人参与
# 软件开发薪资爆料 #
2183813次浏览 21801人参与
# 米哈游求职进展汇总 #
176678次浏览 1464人参与
# 美的求职进展汇总 #
206995次浏览 1619人参与
# 2023毕业生求职有问必答 #
120918次浏览 1303人参与
# 机械制造秋招总结 #
30472次浏览 354人参与
# 如果不工作真的会快乐吗 #
60210次浏览 528人参与