2010-12-16 83 views
1

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

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

我该如何彻底删除已终止的Swingworker线程?

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

任何建议是最感谢。谢谢。

回答

1

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

Java进程永远不会释放任何存储器 (例如,如由Windows任务 管理器示出)。

JVM(至少Sun/Oracle之一)通常非常不愿意将内存返回到操作系统,并且只有当超过70%的堆内存未使用时才会这样做。 This can be tuned使用-XX:MaxHeapFreeRatio命令行选项(但通常应保持原样)。

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

+0

好的, 谢谢。看来你的声明JVM不愿意将内存返回给操作系统,这是对正在发生的事情的正确解释。而且,是的,当我强制垃圾收集时,JConsole确实显示堆内存已经返回。 – Lulach 2010-12-21 09:44:56

0

我有类似的问题。我使用多个SwingWorker线程来执行一些计算,Windows任务管理器报告java.exe中的线程数量永远不会下降,总是处于最高状态。如果任务正常完成或取消,似乎并不重要。

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

据我所知,有时候这些并不是唯一的限制。在Windows(XP或更高版本)中,我听说,尽管操作系统没有明确规定限制,但拥有超过1000个线程的进程往往会因无明显原因而崩溃。

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

问题是,这可能是一个真正的问题。如果在某些操作系统和/或硬件平台上存在线程数问题,那么有人在很长一段时间内使用这样的程序(不会退出几个小时)可能会有一些非常糟糕的体验......