java - 垃圾收集器不会立即收集完成的线程

标签 java multithreading memory-management garbage-collection

简而言之:我有一个线程已完成运行,但没有被垃圾收集。

长篇大论:见以下示例代码:

public void saveSomething() {
    Thread thread = new Thread(new Runnable() {

         @Override
         public void run() {
             // heavy memory access (~400 MB), finishes after ~10sec
         }
    });
    thread.start();
}

好的,所以这个线程会在一段时间后开始并结束。在此期间会使用大量内存,这没关系。但我的问题是:

线程结束后,内存未释放

而且我不知道如何确保这一点。 据我所知,不再使用的已完成线程应该收集垃圾;但这似乎不会在这里发生:(

查看 jvisualVM 的截图:

enter image description here

1:我通过调用 saveSomething()

触发线程启动

2:线程很早就结束了(我是通过调试看到的),我在jvisualvm中按下了“Perform GC”

如您所见,在我强制 GC 之后,一切都按我的意愿运行。但这必须自动发生。我该怎么做,我做错了什么?

如果您需要更多信息,请询问。 注意:似乎一天后(希望更短)内存恢复正常,也许 GC 只是“慢”或者不是很频繁地计时?

最佳答案

会不会是你问错了问题?我的意思是:垃圾收集没有“立即”发生对您来说是个问题吗?

我很确定 - 当您启动另一个需要大量内存的此类线程时,GC 将自行启动。

如果“延迟”对您来说确实是个问题,您可以考虑进行“非常深入的研究”,以了解 GC 对您的 JVM 版本的实际工作方式;然后开始使用现有的许多命令行选项来根据您的需要微调 GC 行为。

但是,如果释放内存(对其他 Java 对象)的“延迟”不是问题;然后不要开始修复它。

关于java - 垃圾收集器不会立即收集完成的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30453551/

相关文章:

java - 使用java正则表达式搜索多个ora错误消息

java - 如何将字节数组转换为其数值(Java)?

java - Java 6 同步的变化?

c - 为什么 Linux 内核不使用大页面?

c++ - Qt 堆碎片 - QObjects 可以放在内存池中吗?

java - 我无法登录,因为我在密码字段中使用了 aes_encrypt

java - java中window和linux需要单独的文件路径吗

c++ - 另一个线程是否可以通过其地址访问本地函数\此优化是否有效\我是否遗漏了一些重要的东西?

ios - 在模拟器上运行应用程序时,它崩溃并提示 thread 1 : breakpoint 3. 1. 我该怎么办?

java - 使用NIO解码器会导致读取整个文件吗?