简而言之:我有一个线程已完成运行,但没有被垃圾收集。
长篇大论:见以下示例代码:
public void saveSomething() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// heavy memory access (~400 MB), finishes after ~10sec
}
});
thread.start();
}
好的,所以这个线程会在一段时间后开始并结束。在此期间会使用大量内存,这没关系。但我的问题是:
线程结束后,内存未释放
而且我不知道如何确保这一点。 据我所知,不再使用的已完成线程应该收集垃圾;但这似乎不会在这里发生:(
查看 jvisualVM 的截图:
1:我通过调用 saveSomething()
2:线程很早就结束了(我是通过调试看到的),我在jvisualvm中按下了“Perform GC”
如您所见,在我强制 GC 之后,一切都按我的意愿运行。但这必须自动发生。我该怎么做,我做错了什么?
如果您需要更多信息,请询问。 注意:似乎一天后(希望更短)内存恢复正常,也许 GC 只是“慢”或者不是很频繁地计时?
最佳答案
会不会是你问错了问题?我的意思是:垃圾收集没有“立即”发生对您来说是个问题吗?
我很确定 - 当您启动另一个需要大量内存的此类线程时,GC 将自行启动。
如果“延迟”对您来说确实是个问题,您可以考虑进行“非常深入的研究”,以了解 GC 对您的 JVM 版本的实际工作方式;然后开始使用现有的许多命令行选项来根据您的需要微调 GC 行为。
但是,如果释放内存(对其他 Java 对象)的“延迟”不是问题;然后不要开始修复它。
关于java - 垃圾收集器不会立即收集完成的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30453551/