ヒープサイズが最大128 MB(-Xmx128M)のJavaアプリケーションを実行しています。 OutOfMemoryErrorやその他の未処理の例外なしで正常に完了しています。したがって、私は実際のヒープサイズが宣言された128 MBの制限内にとどまっていたと仮定しています。JVMの総メモリ使用量がXmx値の30倍を超えるのはなぜですか?
しかし、このJavaアプリケーションのプロセスを観察すると、4,188,548 KB(〜4 GB)の合計メモリ使用量がピークに達しています。これは、制御されたヒープの最大サイズの30倍以上の成長です。この値には、使用されている実際の物理メモリよりも大幅に大きい仮想メモリが含まれていることがわかっていますが、Sun Grid Engineによって課せられたような厳しい制限に影響するため、意味があります。
これはどのように可能ですか?私は、JVMで消費されるメモリの総量にヒープのサイズよりもかなり多くのメモリが含まれていることを理解していますが、アプリケーションがオブジェクトを作成して計算を実行するために実際に必要な容量を超えて、 。
64ビットRHEL LinuxディストリビューションでSun Java 1.6.0.31を使用しています。
無限の数の 'new Thread()'を作成していますか?あなたが生成する各ネイティブスレッドには、Javaヒープの一部ではないメモリのスタックがあります。 – Affe
メモリ使用量はどのような尺度ですか?それにマップされた実際のコンテンツを持たない割り振られたアドレススペースはおそらくあなたが気にするものではありません。 VIRTではなくRSSを測定していることを確認してください。 –
@Affeスレッドの問題ではありません。アプリケーションはシングルスレッドです。 – jjcarver