java - 垃圾收集新生代扫描

标签 java garbage-collection

我正在尝试了解垃圾回收机制,我正在研究分代算法,我有一个关于年轻一代/老一代差异的问题。我读到开始在年轻代 GC 中收集对象是从 GC 根开始标记它们以找到 Activity 对象,通常它将它们复制到幸存者空间,清除年轻代区域,瞧。

我不明白,如果我们从 GC roots 开始,我们开始遍历 Activity 对象,难道我们不会在老年代找到对象吗?这是否意味着当我们在旧空间中击中一个对象时,我们会在那个点停止跟踪引用或什么?

最佳答案

虽然我没有直接检查过这一点,但常识表明,每次遇到来自老年代的对象时,对象图遍历都会减少。请注意,此检查的成本非常低:对指针值进行简单的范围检查就足以确定对象在堆区域内的位置。

然而,还有另一个重要的问题需要考虑:如果只能通过旧对象访问新对象怎么办?显然,必须以某种方式将老一代视为

进入卡表:这是每个堆区域前面的支持结构,其中保存该区域的压缩“位图” View ,例如,每个位对应于 256 字节堆。每次更新引用类型变量时,卡表中的相应位都会被提升为 1,表示“脏”。

在卡表就位后,每个 YG 集合都会发生以下情况:扫描所有标记为“脏”的堆 block 以查找指向年轻代中对象的指针。以这种方式找到的每个对象都被认为是可达的。

以上的推论:通过旧对象可访问的新对象同时变成垃圾将被视为可访问并污染堆,直到发生主要 GC。

关于java - 垃圾收集新生代扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26280684/

相关文章:

java - JFX 组合框提示文本

java - Intellij 不会自动更新我的 Google App Engine 项目的资源

c# - 如何从对象内部的工作线程检测对象的无效化

c# - 32 位和 64 位应用程序之间的 GC 行为不一致

java - 如何调整 JVM 8 G1 参数以避免 Full GC(分配失败)

Java ThreadPoolExecutor 处理时挂起

Java 记录器 - "No line break"和 "explicit class logging"问题

java - gettext-commons 找不到资源包

java - 非常大的堆大小,但使用的内存很小

java - java中String的垃圾回收