0

さまざまなスレッドで同時に多くのシミュレーションを実行し、結果を平均化する Java プログラムを作成しています。同時に実行できる以上の多くのシミュレーションを実行したいので、メモリを使い果たすことなくできるだけ多くのシミュレーションを同時に実行し、残りを「キュー」に入れたいと考えています。

スレッドが使用する最大ヒープ メモリを特定する簡単な方法はありますか?

メモリが開いたときにのみ新しいスレッドを開始できるように、実行時に使用されているヒープメモリの量を確認する簡単な方法はありますか?

PS: マルチスレッド アプリケーションの最適化は初めてです。

4

3 に答える 3

1

スレッドをプロファイリングして、占有されているヒープの量を判断します。これをプログラムで行う方法はありません。

コアよりも多くのスレッドを使用しないでください。新しいスレッドの作成は比較的高価な操作であり、作成するスレッドが多すぎると、実際にはアプリケーションの実行が遅くなる可能性があります。巨大なデータを処理している場合、または非常に低いレイテンシが必要な場合は、多くのスレッドを作成することを本当に避けたいと思うでしょう.

ExecutorServiceを調べることをお勧めします。シミュレーション マシンのコア数と同じ固定スレッド プールを作成します。

編集:

Java 1.4 以降、これを利用できるようになりました。

int cores = Runtime.getRuntime().availableProcessors();

これを試して、スレッドで固定スレッドプールを作成してくださいcores。これにより、コアが異なるマシン間でアプリケーションをスケーリングできます。

これは論理コアの数であるため、Intel のハイパースレッディング機能を使用すると、プロセッサごとに 2 つの「コア」がカウントされることに注意してください。それでも、良い測定値です。

于 2013-08-21T20:00:28.577 に答える
0

これは「簡単な」作業ではありませんが、いくつかの方法があります。jvm は、管理 API を介して現在のメモリ使用量を公開します。MemoryMXBean と MemoryPoolMXBean を使用して、現在の jvm メモリ ステータスにアクセスできます。

于 2013-08-21T20:05:14.160 に答える