2011年7月24日日曜日

メモリー状態ダンプ

先の記事のメモリー状態監視でメモリーの使われ方を監視する方法を書きましたが、次にきになるのは実際のメモリーがどうなっているのか?ということです。

SunのJavaVMメモリーをDumpする方法がありますのでそれを利用します。
まず基本から
1:JDKについているjconsoleを起動します。
2:次に対象のプロセスにアクセスします。リモートプロセスの場合はservice:jmx:rmi://[]・・・という長いコマンドを入力する必要があります。
3:一番右のMBeanのタブをクリック
4:左のBeans一覧から[com.sun.management]-[HotSpotDiagnostic]-[操作]-[dumpHeap]を選択
5:右のパネルに関数の情報がでてくるので、
p0にファイルを指定[/tmp/message/memorydump.hprof]
p1にtrue/falseを指定[trueでいいと思います。このフラグはdumpするときにGC改修予定のオブジェクトを無視するかどうかのフラグです。]
6:dumpHeapのボタンをクリック
これで対象プロセスが動作しているサーバーにデータが出力されます。

dumpしたデータは作業用PCにダウンロードして、java visualvmを利用して確認します。
1:JDKについているJavaVisualVMを起動します。
2:読み込み→右下の拡張子設定をHeapDumpに設定
3:先ほどのデータを読み込む
これで読み込みが完了します。
(なおVisualVMはjconsoleの動作をかねてる部分もあるので、visualVMからdumpHeapを実行することもできます。(出力先は固定されますけど。))

クラスオブジェクトのもつフィールドデータやクラスオブジェクトを参照しているデータの情報がわかるので、必要のないはずのデータがなぜのこっているのか?どのクラスのデータがたまっているのか?といった情報がするみつけることができます。

ちなみに僕はこれを利用して、SpringのBeanの階層のrootを取得することができました。VisualVMめっちゃ便利です。

0 件のコメント:

コメントを投稿