gpt4 book ai didi

java - GC 如何阻止新创建的内存/对象在 GC 周期期间进行清理 (Java/C#)

转载 作者:行者123 更新时间:2023-12-01 19:39:40 25 4
gpt4 key购买 nike

假设我们采用如下示例代码

class Employee 
{
int id;
String name;
}

Employee e = new Employee(1, "NewEmployee");

在上面的代码中,我假设首先为 Employee 对象分配堆内存,然后将其引用分配给堆栈引用e

以上内容有效还是这里发生了深刻的事情?

如果是,那么我们假设在堆中创建内存之后以及将其引用分配给 e 之前,GC 启动并识别出 GC 没有对此新堆内存的引用根。

  1. GC 会清理此资源吗?
  2. 有没有办法 JVM/CLR 处理这些场景并避免这种内存损坏?

标记 Java 和 C#,因为我看到 Java 和 C# 的标记和清除情况下的清理逻辑似乎几乎相同(至少在从根识别未使用的对象和清理方面)。

最佳答案

Then lets assume right after the memory creation in heap and just before its reference is assigned to e, a GC kicks in and identifies there are no references to this new Heap memory from GC roots

这是错误的假设,GC 根本不会在此类分配的中间启动。显然,这是不正确且危险的行为。

更一般地说,当 JITtting 方法时,会在 GC 可能启动的地方注入(inject)“安全点”。这些通常是子方法调用、长循环等(它严格取决于 JIT 实现)。

不确定 JVM,但在 CLR 中,很难看到关于安全点的此类“GCInfo”,即使您将获取生成的汇编代码(例如通过使用 https://sharplab.io )。我不知道除了 WinDbg 之外还有什么工具可以看到它。

关于java - GC 如何阻止新创建的内存/对象在 GC 周期期间进行清理 (Java/C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55723471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com