2012-03-15 6 views
9

ヒープサイズが最大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を使用しています。

+2

無限の数の 'new Thread()'を作成していますか?あなたが生成する各ネイティブスレッドには、Javaヒープの一部ではないメモリのスタックがあります。 – Affe

+0

メモリ使用量はどのような尺度ですか?それにマップされた実際のコンテンツを持たない割り振られたアドレススペースはおそらくあなたが気にするものではありません。 VIRTではなくRSSを測定していることを確認してください。 –

+0

@Affeスレッドの問題ではありません。アプリケーションはシングルスレッドです。 – jjcarver

答えて

4

いくつかのメモリシンクは-Xmxによって制御されるJavaヒープ以外にあります

  • スレッドが
  • PermGenスペース
  • 直接ByteBuffersスタックとネイティブコード/ライブラリ
  • によって割り当てられた ByteBuffer
  • メモリをマッピングし

詳細を知らないうちにあなたのシステムの私は、何かがマップされたByteBuffersを使用すると推測します。

しかし、pmapコマンドの出力を調べることで問題を掘り下げることができます。プロセスのすべてのメモリ領域と、どの領域にマップされているファイル名もリストされます(領域がもちろんマップされている場合はです)。

+1

これは素晴らしい提案ですが、pmapの出力では、残念ながら、深刻な問題を引き起こすメモリ領域はすべて、 "anon"の "Mapping"カラムを持っています。 '000000052d4c0000 7722240 0 0 rw --- [anon]' – jjcarver

+0

'anon'リージョンは、上記のリストを「native libs」と「direct ByteBuffers」に減らします。 –

関連する問題