1

私のプログラムはいくつかのSwingworkerスレッドを使用しており、完了後に各スレッドのメモリを解放する必要があります。doInBackground()私のスレッドがメソッドを完了することによって終了するか、によって停止されるかにかかわらず、cancel()スレッド自体はそこにとどまります(Jconsoleに引き続き表示されます)。

インスタンスを逆参照しSwingworkerてガベージコレクションを強制しますが、Javaプロセスがメモリを解放することはありません(たとえば、Windowsタスクマネージャーで表示されるように)。

Swingworker終了したスレッド を完全に削除するにはどうすればよいですか?

または、複雑な処理中に複数の場所に割り当てられたメモリをどのように解放できますか?

どんなアドバイスも大歓迎です。ありがとう。

4

2 に答える 2

1

おそらく何もする必要はなく、コードはすでに目的どおりに機能しています。スレッドはスレッド プールの一部であるため、まだ存在していますが、SwingWorker オブジェクトによって使用されているメモリが解放されていないわけではありません。

Java プロセスがメモリを解放することはありません (たとえば、Windows タスク マネージャで示されるように)。

JVM (少なくとも Sun/Oracle のもの) は一般に OS にメモリを返すことを非常に嫌がり、ヒープメモリの 70% 以上が未使用の場合にのみそうします。これは、コマンド ライン オプションを使用して調整でき-XX:MaxHeapFreeRatioます (ただし、通常はそのままにしておく必要があります)。

プログラムのメモリ使用量を診断するには、使用済みヒープ メモリと空きヒープ メモリを表示できる VisualVM などのツールを使用する方がはるかに便利です。私は JConsole についてよく知りませんが、JConsole にもその機能があることを期待しています。

于 2010-12-16T11:58:24.813 に答える
0

同様の問題があります。複数のSwingWorkerスレッドを使用して計算を行っていますが、Windowsタスクマネージャーは、java.exeのスレッド数が減少することはなく、常に増加することを報告しています。タスクが正常に完了したかキャンセルされたかは、まったく問題ではないようです。

私が今知っていることから、スレッドの数は、マシンのRAMの量と、プロセスで使用可能な最大アドレス空間(32ビットオペレーティングシステムでは、その値は2 GB)によって異なります。

私が知っていることから、時々これらが唯一の制限ではありません。Windows(XP以降)では、OSによって明示的に制限は課されていませんが、1000を超えるスレッドを持つプロセスは、明らかな理由もなくクラッシュする傾向があると聞きました。

プログラムを使用して、数が非常に大きくなるまで、これらのSwingWorkerスレッドを開始およびキャンセルしようとします。私は何が起こるのか非常に興味があります(私はXP32ビットと1GB RAMを持っています)。

問題は、これは本当の問題かもしれないということです。一部のオペレーティングシステムやハードウェアプラットフォームでスレッド数の問題がある場合、そのようなプログラムを非常に長期間使用している(何時間も終了しない)人は、非常に悪い経験をする可能性があります...

于 2011-08-08T19:20:41.407 に答える