gpt4 book ai didi

java - Java中的多线程垃圾收集: Sharing object outside prevents GC?

转载 作者:行者123 更新时间:2023-12-01 13:56:59 25 4
gpt4 key购买 nike

考虑以下方法:

public void Parse(String[] S, Objects[] O) throws IOException {
final int N_THREADS = Runtime.getRuntime().availableProcessors();
BlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<Runnable>(20);
RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy();
ThreadPoolExecutor service = new ThreadPoolExecutor(N_THREADS, N_THREADS, 0L, TimeUnit.MILLISECONDS, blockingQueue, rejectedExecutionHandler);
final SomeObject RO = new SomeObject();
for(String s : S){
service.execute(new Runnable() {
public void run() {
// initialize variables
for (Object o : O) {
V ps = RO.apply(sentence);
//more work on ps
}
File f = new File("something");
FileWriter fw = null;
try {
fw = new FileWriter(f.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
} catch (IOException e) {
System.out.println(f.getAbsoluteFile());
}
BufferedWriter bw = new BufferedWriter(fw);
for (SentenceAnnotation entry : annotations) {
try {
bw.write(entry.toString());
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}

try {
bw.flush();
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
service.shutdown();
while (!service.isTerminated()) {
}
long timeEnd = System.currentTimeMillis();
}

其中 S 是一个大数组(数十万),O 的长度为 50。我的问题是关于 RO 对象。它是在外部创建的,并且如果您愿意的话,可以由所有线程“共享”。现在,当这段代码运行一段时间后,堆空间耗尽,这让我很困惑。我倾向于认为 RO 对象仍然使原本已完成的 Runnables 保持 Activity 状态并慢慢消耗内存。真的吗?我使用“free -m”监控了linux系统(最新版本的Oracle JDK)的内存消耗,我可以缓慢但肯定地看到内存消失。我非常感谢您给我的任何建议。

最佳答案

 try {
fw = new FileWriter(f.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
} catch (IOException e) {
System.out.println(f.getAbsoluteFile());
}
BufferedWriter bw = new BufferedWriter(fw);

您在这部分代码中泄漏了未关闭的BufferedWriter。您在 try 子句的作用域中创建第一个,但不要关闭它。引用消失,但运行时创建的任何 native 处理都不会被释放。您不会注意到,因为您随后立即为同一个文件创建了一个新的 BufferedWriter

关于java - Java中的多线程垃圾收集: Sharing object outside prevents GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19574229/

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