我的程序使用了几个Swingworker
个线程,我需要在完成后释放每个线程的内存。无论我的线程是通过完成doInBackground()
方法终止还是被cancel()
停止,线程本身都会保留在那里(它仍然显示在Jconsole中)。
我取消引用Swingworker
实例并强制进行垃圾收集,但我的Java进程从不释放任何内存(例如,如Windows任务管理器所示)。
如何彻底删除已终止的Swingworker
主题?
或者如何在一些复杂的处理过程中释放它在几个地方分配的内存?
非常感谢任何建议。感谢。
答案 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)。
问题在于,这可能是一个真正的问题。如果在某些操作系统和/或硬件平台上存在线程计数问题,那么使用此类程序很长一段时间(不会退出几小时)的人可能会遇到一些非常糟糕的经历......