垃圾回收器不会立即收集完成的线程
2022-09-02 04:56:47
简而言之:我有一个线程,它已完成运行,但未被垃圾回收。
长篇大论:请参阅以下示例代码:
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中按了“执行GC”
如您所见,在我强制GC之后,一切都按照我想要的方式工作。但这必须自动发生。我该怎么做,我做错了什么?
如果您需要更多信息,请询问。注意:似乎一天后(希望更短)内存恢复正常,也许GC只是“慢”或不是很频繁地计时?