如何释放Swingworker分配的内存?

时间:2010-12-16 11:44:23

标签: java multithreading swing swingworker

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

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

如何彻底删除已终止的Swingworker主题?

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

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

2 个答案:

答案 0 :(得分:1)

您可能无需执行任何操作,并且您的代码已按预期工作。 Teh线程仍然存在,因为它是线程池的一部分,但这并不意味着SwingWorker对象使用的内存不会被释放。

  

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

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

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

答案 1 :(得分:0)

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

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

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

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

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