当前位置: 首页 > 知识库问答 >
问题:

如果我们在年轻一代标记后知道所有死亡对象,为什么我们需要在老一代中特定搜索无法到达的对象?

江鹏飞
2023-03-14

我知道,在CMS和G1中,堆被划分为伊甸园、幸存者空间和老一代,唯一的区别是,在CMS中,这个划分是真实的(这些空间是连续的,位于内存的不同部分),而在G1中,它是逻辑的(堆被划分为±2000个动态区域,每个区域的大小为1到32 MB)。

在这两种情况下,当伊甸园空间达到阈值时,开始疏散,步骤如下:初始标记。STW。标记应用程序的根。同时标记。从链接的根开始,有从这些对象到其他对象的对象转换,因此实现的对象被标记为活动对象。评论STW。在并发标记期间创建的对象也被标记为活动(浮动垃圾)。清理这最后一个阶段为即将到来的疏散阶段做好准备,计算堆区域中所有活动对象的数量,并根据预期的GC效率对这些区域进行排序。

如果堆的完成达到阈值,那么混合疏散(年轻-年老)将在G1中开始。在老一代人中发现死亡物体是基于“记忆集”。每个区域都有一个记忆集,其中列出了从外部指向该区域的引用。这些引用被视为附加的GC根。

G1决定将哪些地区从老一代和年轻一代添加到集合中之后。

如果我们拥有所有物体的完整图形,并且在年轻的疏散层上标记后知道所有活着和死去的物体,那么为什么我们需要记忆的集合和对旧一代中无法到达的物体的特定搜索?

共有1个答案

周昊乾
2023-03-14

记忆集(或CMS中的卡片表)背后的想法不是“在老一代中搜索无法到达的对象”,而是快速识别老一代中的引用,这些引用需要在年轻收集期间移动活动对象时更新。

疏散对象的地址被更改=

 类似资料:
  • 问题内容: 如果我们使用ExecutorCompletionService,则可以将一系列任务作为s 提交,并将结果作为进行交互。 但也有在的,它接受一个任务,我们得到的名单,以检索结果。 据我所知,使用一个或多个都不会有任何好处(除了我们避免使用循环,否则我们将不得不对任务进行操作),并且基本上它们是相同的想法,只是稍有不同。 那么,为什么有两种不同的方式提交一系列任务呢?我在性能上正确吗?有没

  • 问题内容: 在回答中,用户说了这样的话:“带有ArrayLists的迭代器的一个大用例是,当您要在迭代时删除元素时”。 即使使用Java中的ArrayList的remove方法也可以实现。我的问题是为什么我们在ArrayList中需要迭代器? 考虑以下代码: 谁能解释迭代器的意义?如果可以用代码解释我,那将是很棒的。 问题答案: 如前所述,迭代器用于迭代数组内容时要删除的内容。如果您不使用迭代器,

  • 假设我在程序中有一段代码: 有人建议我在调用消息之前检查消息的空值。getUserId()。 检查null有两种方法:第一种: 第二种方式: 我的问题是: 哪种方式对null检查更好?返回还是抛出异常? 为什么我们在这里需要空检查?如果我们不这样做,那么无论如何都会抛出。

  • 问题内容: 我将稍微解释一下我的脚本,以便您可以理解我的问题。 基本上我做了一个脚本来检查SOCKS5是还是。 当我在上面测试我的脚本时,它运行良好,但是当我在Windows上对其进行测试时,直到我将以下行添加到: 谁能向我解释为什么我在Windows中需要此行,而在Linux服务器上却不需要? 问题答案: SSL证书上的此cURL手册页介绍了连接到SSL / TLS受保护主机时 证书验证 的过程

  • 我阅读了一些文章,发现:默认情况下,预启用了以下HttpMessageConverters实例: ByteArrayHttpMessageConverter-转换字节数组 StringHttpMessageConverter-转换字符串 ResourceHttpMessageConverter-转换org.springframework.core.io.resource用于任何类型的八位组流 So

  • 问题内容: 我想知道一个仅在Eclipse上使用Maven或Ant的具体示例。 当我在Eclipse中进行开发时,Eclipse会为我做所有事情,而我只需要单击run按钮。而且,Eclipse可以让您将代码导出到Windows的可运行jar或.exe中。 所以我真的不知道为什么我需要Maven或Ant。 而且,如果确实需要, 我应该选择Maven还是Ant? 问题答案: 因为您的同事可能更喜欢Ne