2010-12-06 16 views
1

私は今、本質的にプログラムに取り組んでいます。各道に無作為に到着する車で4ウェイの停車があります。各道路はFCFSで提供され、交差点は一度に1台の交差点で管理されるラウンドロビンスタイルです。それぞれの待っている車は糸です。私はスレッド同期とアルゴリズムを問題なく動作させました。私が明らかにできない問題は、エラーを防ぐ方法です:OutOfMemoryError:新しいネイティブスレッドを作成できません。私はこれがヒープ(スタック?私はいつもそれらが切り替えられる)が満杯になることによると分かります。実行されたスレッドがガベージコレクタによって適切に管理され、実行後にメモリに残っていないことを確認する方法を理解できません。私は自分のキュー(車のスレッドでそれぞれの "道路")をソフトリファレンスで設定しようとしましたが、ハードリファレンスは無駄にしていません。誰でもここでこれを経験しています!感謝!!!Javaスレッドのメモリ管理の問題

+2

トレッドの処理方法を示すコードがあります。 –

答えて

0

ThreadPoolを試しましたか?

Java 5以降でThreadPoolを作成することができます。ここでは、Vmがアルゴリズム用に初期化するスレッドの数を決定します。スレッドは作成され再利用されます。

私にも同様の問題がありました。スレッドはGarbageCollectorによって削除/削除されず、何とか永遠に生き残ります。

2

"OutOfMemoryError:新しいネイティブスレッドを作成できません" ではありませんはヒープメモリを参照しています。参照をヌルにしたり、ソフト/弱参照を使用したりするのに役立つものではありません。さらに、ヒープサイズを大きくすると状況が悪化する可能性があります。

Javaはスレッドスタックにネイティブメモリを使用します。スレッドを開始するたびに、新しいスタックがJVMヒープの外側に割り当てられます。スタックは、スレッドが終了するまで解放されません。 (例えば、ThreadPoolExecutorを使用して数を制御できる)、またはスタックサイズを小さくする(-Xss {size} kを使用する)ことを検討してください。

多くの種類のメモリ不足エラーの詳細については、this postを参照してください。 。

0

これは、実行スレッドが多すぎる場合にのみ発生します。 (スレッドへの参照だけでなく)@Markusのように、スレッドの作成を管理するのでExecutionServiceのようなThreadPoolに切り替えることをお勧めします。

BTW:並行性ライブラリは1998年のものですが、Java 5.0(2005)にのみ含まれていました。古いバージョンを使用する必要がある場合は、バックポートまたは元のライブラリを使用できます。