gpt4 book ai didi

java - Java 局部变量何时符合 GC 条件?

转载 作者:搜寻专家 更新时间:2023-10-31 08:06:32 25 4
gpt4 key购买 nike

给定以下程序:

import java.io.*;
import java.util.*;

public class GCTest {

public static void main(String[] args) throws Exception {
List cache = new ArrayList();
while (true) {
cache.add(new GCTest().run());
System.out.println("done");
}
}

private byte[] run() throws IOException {
Test test = new Test();
InputStream is = test.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buff = new byte[256];
int len = 0;
while (-1 != (len = is.read())) {
baos.write(buff, 0, len);
}
return baos.toByteArray();
}

private class Test {
private InputStream is;

public InputStream getInputStream() throws FileNotFoundException {
is = new FileInputStream("GCTest.class");
return is;
}

protected void finalize() throws IOException {
System.out.println("finalize");
is.close();
is = null;
}
}
}

当 run 方法中的 while 循环仍在执行且局部变量 test 仍在范围内时,您是否期望最终调用?

更重要的是,这种行为是否在任何地方定义? Sun 是否有任何声明它是实现定义的?

这与之前在 SO 上提出这个问题的方式有点相反,人们主要关注内存泄漏。在这里,我们让 GC 积极地对我们仍然感兴趣的变量进行 GC。您可能期望因为测试仍在“范围内”,所以它不会被 GC。

根据记录,有时测试“有效”(即最终遇到 OOM)有时失败,具体取决于 JVM 实现。

不捍卫这段代码的编写方式,顺便说一句,这只是工作中出现的一个问题。

最佳答案

虽然如果对象仍在范围内则不会被垃圾回收,但如果该变量实际上未在代码中进一步使用(因此您会看到不同的行为),JIT 编译器可能会将其移出范围即使当您阅读源代码时,该变量似乎仍然“在范围内”。

我不明白如果你不再在代码中引用一个对象,你为什么要关心它是否被垃圾收集,但如果你想确保对象留在内存中,最好的方法是直接在字段中引用它们一个类(class),甚至更好的静态领域。如果静态字段引用该对象,则不会进行垃圾回收。

编辑:Here是您正在寻找的明确文档。

> I'm assuming an object cannot die before a local reference to it has gone out of scope.

This can not be assumed. Neither the Java spec nor the JVM spec guarantees this.

Just because a variable is in scope, doesn't mean the object it points to is reachable. Usually it is the case that an object pointed to by an in-scope variable is reachable, but yours is a case where it is not. The compiler can determine at jit time which variables are dead and does not include such variables in the oop-map. Since the object pointed to by "nt" can [sic - should be cannot] be reached from any live variable, it is eligible for collection.

关于java - Java 局部变量何时符合 GC 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1363075/

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