2010-12-16 105 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)。

問題是,這可能是一個真正的問題。如果在某些操作系統和/或硬件平臺上存在線程數問題,那麼有人在很長一段時間內使用這樣的程序(不會退出幾個小時)可能會有一些非常糟糕的體驗......