栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java GC:为什么要有两个生存空间?

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

Java GC:为什么要有两个生存空间?

原因是,您猜对了,性能。首先让我解释一下为什么还存在幸存者空间。关于 对象重定位 的基本考虑,有两种主要的垃圾收集器设计:

  • 就地 压实 收集器;

  • 一个 拷贝 收集器。

基本上,因为它永远不会覆盖任何对象,所以复制收集器可以更快地运行并可以有效地并行化。如果不使用一个“活动”堆空间和一个“休眠”堆空间,那么在每次GC运行之后这两个转换角色就无法实现。

复印收集器的基本设计

注意:以下内容 不是 对HotSpot实际GC的描述,而是CJ
Cheney在1970年ACM论文中介绍的原始设计的那些方面。HotSpot进行了进一步的改进,其中之一是添加了下面说明的 Eden 空间。

复制收集过程开始时,涉及两个空格:

  • 空间:连续的内存块分为两个区域:
    • 上届GC的幸存者;
    • 新对象(自上次GC后创建);
  • 空间:完全空了。

GC运行的任务是在“ 起始” 空间中识别所有尚存的对象并将其复制到“目标 空间。

随着“ 到” 空间的建立,“ 从” 空间将被完全撤离,并且无需向其写入任何内容。

单次 复制GC __

复制收集器的主要优点是它是单遍的:我们只需扫描所有GC根目录,复制所有这些对象,然后扫描这些对象以获取进一步的引用,然后复制所有引用对象。我们从不重访任何对象,也不需要任何支持的内存结构。(请
在此处对此进行详细说明)。

前向指针

随着每个生存对象的重定位,可以用 转发指针
标记旧位置,然后在扫描生存对象以查找对重定位对象的引用并更新这些引用时,可以有效地使用此信息。旧参考指向前向指针,因此新指针值仅需查找一次。

为什么要第三个空间?

您的问题是:“为什么有两个幸存者空间?” 实际上最好用“为什么要使用单独的 伊甸园 空间”这样的表述呢?

HotSpot引入了作为优化的 Eden 空间,该空间使新分配区域的容量保持恒定,并押注了这样一个结果,即大部分对象将立即变成垃圾。您可以将
Eden 视为 两个空间之间 共享 的一部分内存,这部分内存可能在下一个GC时释放。这实际上提高了内存利用率。



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

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

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