1

我的程序使用了多个Swingworker线程,我需要在每个线程完成后释放它的内存。无论我的线程是通过完成doInBackground()方法终止还是被 停止cancel(),线程本身都保留在那里(它仍然显示在 Jconsole 中)。

我取消引用Swingworker实例并强制进行垃圾收集,但我的 Java 进程从不释放任何内存(例如,如 Windows 任务管理器所示)。

如何完全删除已终止的Swingworker线程?

或者在一些复杂的处理过程中如何释放它在几个地方分配的内存?

任何建议都非常感谢。谢谢。

4

2 回答 2

1

您可能不需要做任何事情,并且您的代码已经按预期工作。线程仍然存在,因为它是线程池的一部分,但这并不意味着 SwingWorker 对象使用的内存没有被释放。

Java 进程从不释放任何内存(例如,如 Windows 任务管理器所示)。

JVM(至少是 Sun/Oracle 的)通常非常不愿意将内存返回给操作系统,并且只有在超过 70% 的堆内存未使用时才会这样做。这可以使用-XX:MaxHeapFreeRatio命令行选项进行调整(但通常应保持原样)。

对于诊断程序的内存使用情况,使用像 VisualVM 这样可以显示已使用和空闲堆内存的工具会更有用。我不太了解 JConsole,但希望它也具有该功能。

于 2010-12-16T11:58:24.813 回答
0

我有一个类似的问题。我使用多个 SwingWorker 线程进行一些计算,Windows 任务管理器报告 java.exe 中的线程数永远不会下降,总是上升。任务是否正常完成或取消似乎根本不重要。

从我现在的情况来看,线程数取决于机器的 RAM 量和进程可用的最大地址空间(在 32 位操作系统中,该值为 2 GB)。

据我所知,有时这些并不是唯一的限制。在 Windows(XP 或更高版本)中,我听说,虽然操作系统没有明确施加限制,但拥有超过 1000 个线程的进程往往会无缘无故地崩溃。

我将尝试使用我的程序来启动和取消那些 SwingWorker 线程,直到数量非常大。我很好奇会发生什么(我有 XP 32 位和 1 GB RAM)。

问题是,这可能是一个真正的问题。如果在某些操作系统和/或硬件平台上存在线程计数问题,那么长时间使用此类程序(数小时未退出)的人可能会有一些非常糟糕的经历......

于 2011-08-08T19:20:41.407 回答