关注
二、为什么不是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 评论
相关推荐
球球与墩墩:这不是前端常考的对象扁平化吗,面试官像是前端出来的
const flattern = (obj) => {
const res = {};
const dfs = (curr, path) => {
if(typeof curr === 'object' && curr !== null) {
const isArray = Array.isArray(curr);
for(let key in curr) {
const newPath = path ? isArray ? `${path}[${key}]` : `${path}.${key}` : key;
dfs(curr[key], newPath);
}
} else {
res[path] = curr
}
}
dfs(obj);
return res;
}
查看3道真题和解析 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 月薪多少能在一线城市生存 #
78290次浏览 526人参与
# 你会为了工作牺牲生活吗? #
60417次浏览 423人参与
# 百度秋招 #
37549次浏览 334人参与
# 如果再来一次,你还会选择这个工作吗? #
704149次浏览 5723人参与
# 秋招吐槽大会 #
6158次浏览 70人参与
# offer帮选 #
4344435次浏览 26355人参与
# 技术转行的心路历程 #
72755次浏览 744人参与
# 你找工作想离家近 or 离家远? #
1188次浏览 28人参与
# 总结:哪家公司最喜欢泡池子 #
151164次浏览 543人参与
# 小米编程考试 #
23021次浏览 145人参与
# 你小时候最想从事什么职业 #
134305次浏览 1991人参与
# 互联网行业现在还值得去吗 #
38082次浏览 281人参与
# 虾皮开奖 #
45074次浏览 212人参与
# 滴滴歧视残疾人HR被开除 #
23653次浏览 86人参与
# 京东工作体验 #
19109次浏览 113人参与
# 26届的你们有几段实习? #
153033次浏览 1068人参与
# 25届非技术实习投递记录 #
137128次浏览 1001人参与
# 落户对你的求职选择影响有多大 #
29887次浏览 101人参与
# 机械人,秋招第一次笔试的企业是哪家? #
79572次浏览 611人参与
# 你认为工作的意义是什么 #
210498次浏览 1353人参与
# 大疆求职进展汇总 #
631026次浏览 4260人参与
