2

3 つのスレッドでマルチスレッド アプリケーションを実行しています。

  • メイン スレッド - オブジェクトを格納するベクトル リスト
  • AdderThread - このベクター リストにオブジェクトを追加する
  • RemoverThread - vectorList.clear() メソッドでオブジェクトを削除する (同期)

アプリケーションは正常に動作しますが、数時間後に OutOfMemoryError が発生します。

ヒープ ダンプを生成し、すべてのメモリを使用している vectorList クラスを示す eclipse MAT で分析しました。

clearメソッドは、個々のオブジェクトによって占有されていたメモリを解放しますか?

これを修正する方法は?

4

1 に答える 1

9

タスクを解放するよりも速くタスクを追加すると、Vector がメモリの限界に達するため、OutOfMemoryError が発生します。

ワーク キューに Vector を使用する代わりに、同時実行ライブラリの BlockingQueue を使用することをお勧めします。

例えば

BlockingQueue<Work> queue = new ArrayBlockingQueue<>(MAX_TASKS_WAITING);

AdderThread calls queue.put(work); // blocks if the queue is full

RemoverThread call queue.take(); // blocks if there is nothing to do.

実際、ワーク キューとスレッド プールを組み合わせた ExecutorService を使用する方がはるかに簡単です。タスクをエグゼキュータに送信すると、エグゼキュータがそれらを処理します。これにより、RemoveThread のコードをそのまま記述する必要がなくなります。

于 2012-08-10T10:20:53.837 に答える