2010-12-16 6 views
1

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

Swingworkerインスタンスを逆参照し、強制的にガベージコレクションを実行しますが、Javaプロセスはメモリを解放しません(Windowsタスクマネージャなど)。

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

いくつかの複雑な処理中にいくつかの場所で割り当てるメモリを解放するにはどうすればよいですか?

アドバイスをいただければ幸いです。ありがとう。

答えて

1

あなたはおそらく何もする必要はなく、あなたのコードは既に必要に応じて動作しています。 Tehスレッドはスレッドプールの一部なのでまだそこにありますが、それはSwingWorkerオブジェクトによって使用されるメモリが解放されないことを意味しません。

Javaプロセスは決して(例えば、Windowsのタスクマネージャ によって示されるように)任意のメモリ を解放しません。

JVM(少なくとも日/オラクル1)は、一般的にOSにメモリを返却することは非常に消極的であるとヒープメモリの70%以上が未使用の場合のみ、そうします。 This can be tunedコマンドラインオプションを使用して-XX:MaxHeapFreeRatioを使用します(ただし、通常はそのままにしてください)。

プログラムのメモリ使用量を診断するには、使用されたヒープメモリとフリーヒープメモリを表示できるVisualVMのようなツールを使用するほうがずっと便利です。私はJConsoleについてよく分かりませんが、その機能も備えていると期待しています。

+0

Okay 、 ありがとうございました。 JVMがOSにメモリを返すことに嫌気がしているという発言は、何が起こっているのかについての正しい説明です。そして、はい、JConsoleは、ガベージコレクションを強制するとヒープメモリが返されることを示しています。 – Lulach

0

私も同様の問題があります。私はいくつかの計算を行うために複数のSwingWorkerスレッドを使用し、Windowsタスクマネージャはjava.exeのスレッド数が常に上がることを報告しています。タスクが正常に完了した場合やキャンセルされた場合は、まったく問題には見えません。

スレッドの数は、マシンのRAM容量とプロセスで使用できる最大アドレススペース(32ビットオペレーティングシステムでは2GB)によって決まります。

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

数字が非常に大きくなるまで、自分のプログラムを使ってSwingWorkerスレッドを開始したりキャンセルしたりしようとします。私は何が起こるか非常に不思議です(私はXP 32ビットと1 GBのRAMを持っています)。

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

関連する問題