• 締切済み

JVMでのメモリの使用率について

OS(solaris)のコマンドにてjavaプロセスが使用しているメモリの使用率を把握したいと思っています。 自分の認識では大きく分けると ヒープ領域とネイティブ領域の二つがある認識なのですが、 JVM起動の際にオプションとしてヒープ領域を設定した場合、 ネイティブ領域の割り当てはどのようにして行われるのでしょうか? JAVA_OPTIONS="-hotspot -DWLSERVER_MAIN -Xms256m -Xmx256m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -XX:MaxPermSize=128m 上記オプションにて起動し、OSのプロセス毎のメモリ使用率にて 起動したJVMのプロセスのメモリ使用量を確認すると下記のようになっています。 prstat -u weblogic PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 26603 weblogic 515M 143M sleep 58 0 0:06.32 8.3% java/56 この場合 515MB - 256MB(ヒープ領域) = 259MB(ネイティブとして使用される領域) という認識でいいのでしょうか? 以上、宜しくお願いします。

みんなの回答

  • momozange
  • ベストアンサー率67% (21/31)
回答No.2

遅れました。 > javaオプションにてスタックサイズをしてしなかった場合... ベンダのJVM実装によって違いがあるのですが、通常は512KBの連続メモリ空間です。 最大値という捕らえ方で問題ないと思います。 当然このスタックを超えるオブジェクト管理をJVMが行うとstack overflowという現象が発生します。 メモリの壁の話は少し早計だった気がします。すみません。 OSの管理する物理メモリに対しアプリケーションヒープの壁が存在します。 それが例えばWindowsの場合2GB、Linux(RH)の場合3GBといった具合です。 ネイティブメモリに関しては最初のご質問内容にある通りで恐らく間違いないと思います。 # すみません、保証できません この手の内容ならsunにQ&Aを出すと意外とすんなり回答が来そうな気がします。

  • momozange
  • ベストアンサー率67% (21/31)
回答No.1

基本的な認識はあっていますが、Java以外のプロセスが消費しているメモリを忘れずに計算しなければいけません。 あとネイティブメモリサイズには2GBもしくは3GBという壁が存在します。 さらに言うとOSの稼働時間が長くなるにつれメモリの断片化が進みますので 空き容量が十分であっても、連続するアドレス空間が獲得できずにOutOfMemoryを発生するパターンもあります。 これはJVM内でも言えることです。 システム要件にもよりますが、通常はあまりネイティブメモリのサイズをキャパプラ時の重要事項にはしません。 他に知りたいことがあれば再度質問してください。

hidesbizar
質問者

お礼

回答ありがとう御座います。 >基本的な認識はあっていますが、Java以外のプロセスが消費しているメモリを忘れずに計算しなければいけません。 プロセス毎の使用率を表示しているため、javaのプロセスで使用している領域には間違いないと思います。 >あとネイティブメモリサイズには2GBもしくは3GBという壁が存在します。 このサイズは仮想アドレス空間のサイズという事ですか? もし、物理搭載メモリが1GBだった場合。 JVMが起動した際に、JVMのプロセスに割り当てられる仮想アドレス空間のサイズはどのようにして決まるのでしょうか? 以上、宜しくお願いします。

hidesbizar
質問者

補足

すいません追加でもう一点。 javaオプションにてスタックサイズをしてしなかった場合、 デフォルトのサイズは512KBとという記載を見つけたのですが、 これは1つのスタック(スレッド)にて使用する最大サイズが 512KBと考えていいのでしょうか? それとも最小値が512KBという事でしょうか? 以上、宜しくお願いします。

関連するQ&A