プロが教える店舗&オフィスのセキュリティ対策術

「リソースモニターのプロセスの仮想メモリ量がJavaのオプションで指定した最大ヒープサイズを超過する」

Javaアプリでリークが発生しているために調査しているのですが、
Windows7ProSP1 の環境でリソースモニターで当該プロセスの状況をチェックしていたところ、
JVMのオプション -Xmx で指定した最大ヒープサイズの3倍程度のサイズがコミットの仮想メモリ量として
表示されました。(指定:1GB、コミット:約3GB)

Javaのヒープサイズの上限をはるかに超過するという事象が、
メモリリークの問題に関係するのか、それともリソースモニターではそのような現象は
普通に発生するのかという疑問が課題として発生してしまいました。

調査した範囲ではこのような現象についての情報が見つかりませんでしたので、
ご存知の方がおられましたらご協力をお願いします。

A 回答 (2件)

>システムヒープメモリの倍以上になっており、ヒープメモリ外のメモリがそんなに必要なのかという懸念が残ります。



一番でかい「実行コードが展開されるメモリ」が抜けてました。

ヒープメモリ以外のメモリには、DLLが確保したメモリ等も含まれます。

DLLの使用状況によっては、DLLそのもののサイズも仮想メモリの使用量に含まれる場合もあります。

DLLが使用する分や実行コードも入れたら、3GBは軽く行きそうな気がしますが、如何でしょうか?

今の状況が不正なのか正常なのか知りたいなら、Javaアプリで「ボタンを押したら終了するだけの簡単なアプリ」を組んで、そのテスト用アプリを動かしたときのメモリ状況と比べれば良いでしょう。

-Xmxでヒープサイズを1GBにしてそのテスト用アプリを動かしたとき、コミットの仮想メモリ量が3GB近ければ「それが正常」と判ります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ですが、初期起動状態では仮想メモリは100~200MB程度で、殆どのメモリは
処理実行中に動的に増加したメモリリソースです。

また、Javaアプリなので外部ライブラリは Jar で提供されていますので、
DLLは登場しないのですが。

お礼日時:2013/06/18 11:30

プロセスの仮想メモリ量は、自身がスワップアウトした際の、システムヒープメモリ+システムメモリ+データメモリ+静的ワークメモリ+その他のメモリのサイズになります。



一方Javaの最大ヒープサイズ指定は、システムヒープメモリの最大のみを指定するモノで、プロセスの使用メモリサイズの最大を指定するモノではありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
ただ、教えて頂いた システムメモリ+データメモリ+静的ワークメモリ+その他のメモリ が
システムヒープメモリの倍以上になっており、ヒープメモリ外のメモリがそんなに
必要なのかという懸念が残ります。

お礼日時:2013/06/17 18:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!