1

Javaプロセス(より具体的にはCPUではなくメモリ)に対する待機状態のスレッドの影響を把握するための最良のアプローチを確認しようとしています。それらの影響を理解するのに役立つ提案 (おそらく jvisualvm/jconsole などを介して) は大歓迎です。

更新: 現在のスレッド数は、待機状態で数百 - 約 500 です。古い世代の GC に潜在的な影響を与える可能性があるかどうかを確認する最善の方法を見つけようとしています。

4

2 に答える 2

3

スレッドのメモリ使用量は、概念的に次のように分類できます。

  • スレッド スタック (デフォルトは 2MB だと思いますが、-Xss VM オプションを使用して変更したり、Thread コンストラクターで指定したりできます)

  • Java スレッド オブジェクトと関連オブジェクト (VM ヒープにある)。特定の実装では実質的に一定です。ほんの数KBです。

  • ネイティブ オーバーヘッド - スレッドの管理に必要なカーネル メモリ。無視できるはずです (数 KB)。

  • スレッドによって管理されるユーザー データ (スレッド オブジェクトまたはローカル変数を介して到達可能なデータ)。大きく異なる場合があります。

最初の 3 つの要素は簡単に測定できます (これらは VM インスタンスで実質的に一定であり、スレッドの数に比例してスケーリングします)、最後の要素はスレッドのコード/データに完全に依存します。

通常、スタック サイズは (カーネル オーバーヘッドとスレッド オブジェクトと比較して) スレッドあたりのコストを大きく左右するため、待機中のスレッドのメモリへの影響は、そのスタック サイズに単純化できます。

仮想メモリ システムの場合、仮想的な影響 (割り当てられたアドレス空間) のみであり、必ずしも割り当てられた物理メモリの量ではありません (未使用のスタック スペースには、物理​​メモリ ページが割り当てられることはありません)。32 ビット システムでは、多数のスレッドを作成すると、すぐにアドレス空間が不足する可能性があります (例: 1000 スレッド x 2MB スタック サイズ = 2GB)。

于 2013-10-22T16:10:45.017 に答える