给定以下程序:
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仍在范围内时调用finalize?
更重要的是,此行为在任何地方都有定义吗?Sun有什么声明它是实现定义的吗?
这与以前人们在主要关注内存泄漏的SO上提出此问题的方式相反。在这里,我们让GC积极地对变量感兴趣的变量进行GC处理。您可能会因为测试仍在“范围内”而不会被GC,所以您可能会期望这样做。
作为记录,似乎有时测试“有效”(即最终命中了OOM),有时失败,具体取决于JVM的实现。
BTW不能捍卫这段代码的编写方式,这只是工作中出现的一个问题。