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

GC如何知道旧堆中的对象是否引用了年轻堆中的对象?

爱唯
2023-03-14

次要GC-当垃圾收集器清除年轻一代中未从“根”引用的对象时。次要GC仅适用于年轻堆。但是如果从旧堆引用了年轻对象怎么办?

共有2个答案

东方华荣
2023-03-14

次要GC将收集年轻一代,但这并不意味着GC将只查看年轻一代堆区域。考虑整个堆,从老一代到年轻一代的引用会将年轻一代中的对象标记为活动对象。

这在次要GC与主要GC与完全GC中进行了描述:

在小型GC事件期间,终身发电实际上被忽略。从终身一代到年轻一代的引用被认为是事实上的GC根。在标记阶段,从年轻一代到终身一代的引用被忽略。

计和顺
2023-03-14

垃圾收集器需要知道引用年轻对象的旧对象。要找到所有这些引用,它可以扫描所有旧对象,但这是一个非常糟糕的解决方案。所以记住了要保留这些信息。然后,每个线程通知GC它是否更改了一个引用,这可能会导致记忆集发生更改。

卡片表(字节数组)是一种特殊类型的记忆集。如果引用更改,卡(每个字节在卡表中称为卡)变脏。脏卡包含从老一代到年轻一代的新指针。最后,java不会扫描所有旧对象,而是扫描记忆集。

GC1卡片表和记忆套装

标记卡

 类似资料:
  • 问题内容: 如何在Java程序中找到堆上的活动对象数? 问题答案: 您可以尝试以下方法: 创建自己的java.lang.Object(复制原始源代码) 计算构造函数中创建的对象(不为数组调用) 将您的类文件的路径添加到引导类路径 请参阅此(旧)文章以获取示例。 使用 JPDA或JMX可能有更好的方法,但是我还没有找到方法…

  • 指定在堆叠顺序中的哪个位置添加新对象 Illustrator 从第一个对象开始顺序堆积所绘制的对象。 对象的堆叠方式将决定其重叠时如何显示。对象的堆叠顺序取决于您使用的绘图模式。在正常绘图模式下创建新图层时,新图层将放置在现用图层的正上方,且任何新对象都在现用图层的上方绘制出来。但是,在背面绘图模式下创建新图层时,新图层将放置在现用图层的正下方,且任何新对象都在选定对象的下方绘制出来(如果未选中任

  • 本文向大家介绍如何知道对象是否用JavaScript密封?,包括了如何知道对象是否用JavaScript密封?的使用技巧和注意事项,需要的朋友参考一下 Object.isSealed()是用于查找对象是否在javascript中密封的方法。此方法给出布尔输出。  如果满足以下条件,则将对象密封。 1)不可扩展。 2)其属性应不可配置。 语法 参数  -Object.isSealed()将对象作为参

  • 我有访问内存分析器工具(MAT)、jvisualVM、Jprofiler工具的权限,可以使用它们中的任何一个

  • 是否有任何工具可以转储旧一代的JVM堆? 换句话说,我如何判断一个物体是来自年轻一代还是老一代?

  • jmap帮助显示: ... ... 一旦我转储一个Tomcat(带有java参数-Xmx384m)堆: 我有一个300M的转储文件。 当我只使用活动对象转储其堆时: 我有一个120M的转储文件。 我对活物体的猜测可能是: > 年轻一代中的对象; 使用/引用/可访问且不会被收集的对象。 哪一个是对的? 使现代化 我的猜测#2似乎是正确的,感谢Alexey Ragozin的解释(选项将导致完整GC)。