栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM 新生代为什么要有两个 survivor(from, to) 区

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM 新生代为什么要有两个 survivor(from, to) 区

先附一段对新生代中复制算法较好的理解:

首先得明白复制算法的思想:
将原有的内存空间划分成两块,每次只使用其中一块,在垃圾回收的时候,将正在使用的内存中的存活对象复制到另一块内存区域中,然后清除正使用过的内存区域,交换两个区域的角色,完成垃圾回收。

然后为什么要在新生代中使用复制算法:
因为新生代gc比较频繁、对象存活率低,用复制算法在回收时的效率会更高,也不会产生内存碎片。但复制算法的代价就是要将内存折半,为了不浪费过多的内存,就划分了两块相同大小的内存区域survivor
from和survivor to。在每次gc后就会把存活对象给复制到另一个survivor上,然后清空Eden和刚使用过的survivor。

以上引用自:https://www.zhihu.com/question/44929481/answer/98016105,上述回答解释了:

    为什么新生代要在标记清除死亡对象后使用复制算法,而不是标记清除死亡对象后进行压缩整理以消除内存碎片(此处内存碎片是死亡对象之前所占用的空间)。

    新生代使用复制算法存在的缺陷,由于使用了复制算法,每次只能使用 1/2 的空间,可使用的内存空间变成了 1/2。

    由于存在 2. 中描述的缺陷,要想办法优化,让复制算法中可使用内存空间 > 1/2。优化办法是从 eden 区 : survivor 区 = 1 : 1,变为 eden 区 : survivor 区 = 8 : 2,这样可使用内存空间就变成了 8/10。但是这样在下一次 Young GC 后,存活对象移动到 survivor 区,我们的可使用区域只有 2/8,太小了。

    继续优化 3. 中描述的问题,我们把新生代分为 eden 区 : survivor0(from) : survivor1(to) = 8 : 1 : 1,每次新生代对象在 eden 区创建,上一次 GC 存活的对象在 from 区,下次 GC 时要移动的对象是 eden 区和 from 区中存活的对象,移动至 to 区,然后 from 区和 to 区身份交换。这样我们新生代可使用的内存空间就有 9/10(eden + from) 了。

上述解决方案的演进为 “JVM 新生代为什么要有两个 survivor(from, to) 区” 的原因。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/712763.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号