当前位置: 首页 > 面试题库 >

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

巫健柏
2023-03-14
问题内容

在大多数在线教程中,我们可以看到它们显示了GC中有两个幸存者空间。当我们实际上只有一个幸存者空间时,有什么需要?拥有两个幸存者空间会对性能产生什么影响?


问题答案:

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

  • 就地 压实 收集器;

  • 一个 拷贝 收集器。

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

复印收集器的基本设计

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

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

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

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

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

单次 复制GC __

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

前向指针

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

为什么要第三个空间?

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

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



 类似资料:
  • 我如何优雅地检查这个? 现在我的方式是

  • 问题内容: 对于Sun / Oracle的JVM,我读过GC算法将新一代划分为一个伊甸园区域和两个幸存者区域。我想知道的是,为什么有两个幸存者地区而不是一个?该算法可以在伊甸园和一个幸存者区域之间保持乒乓(目前它在两个幸存者区域之间的方式);或这种方法有什么缺点? 问题答案: 我相信JRockit的GC实现更像您建议的那样工作,只有一个eden和一个幸存者空间,但请不要在此引用我。 HotSpot

  • 本文向大家介绍为什么要用 redis ?为什么要用缓存?相关面试题,主要包含被问及为什么要用 redis ?为什么要用缓存?时的应答技巧和注意事项,需要的朋友参考一下 主要从“高性能”和“高并发”这两点来看待这个问题。 高性能: 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓

  • 本文向大家介绍GC是什么? 为什么要有GC?相关面试题,主要包含被问及GC是什么? 为什么要有GC?时的应答技巧和注意事项,需要的朋友参考一下 答 GC(Garbage Collection) GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: 当程序需要更多的堆空间时,GC需要进行垃圾清理工作,暂停所有线程,找出所有无被引用的对象,进

  • 我试图在ubuntu服务器上安装npm和nodejs,但注意到不知何故,在运行后,我最终得到了两个版本。我知道这一点,因为当我运行时,它会返回,而当我运行时,它返回。在我继续之前,我想把这个设置好。有人明白我为什么会有两个版本吗?我的理解是,安装nodejs也应该安装npm,但这只允许我以更高的权限运行npm,我知道我不应该这样做。谁能让我知道我做错了什么?谢谢你。

  • 为什么它不打印“processTextPosition:ContainsKey”?