
|
小規模なメモリ・リークについては、Javaプログラムを非常に長い期間に継続して運用してはじめて明らかになることがあります。そうした場合は、上記のように画面上で監視し続けるのは現実的ではありません。そこで、メモリ・リークの有無を厳密にテストするときは、Glance/gpmの「adviser
mode」を活用します。
adviser modeとは、Glance/gpmのGUIを起動せず、バッチ形式で動作させるモードのことです。これにより、長期間にわたって収集した大量のデータをファイルに出力し、後ほどゆっくり分析することができます。
以下は、Glance/gpmのadviser modeを利用して5秒ごとにサンプルを採取するコマンドの例です。
| $ /opt/perf/bin/glance ?adviser_only
?syntax adviser_commands -j 1 |
ここでは指定されている「adviser_commandsファイル」には、計測に使用するコマンドを以下のような書式で記述しておきます。
| PRINT "----- ", gbl_stattime, " (proc
name, pid, cpu, negnice cpu, VSS, RSS, thread #, I/O)" |
| |
| PROCESS LOOP { |
| if proc_proc_name == "java" then { |
| PRINT proc_proc_name|8|0, |
| proc_proc_id|8|0, |
| proc_cpu_total_util|8|2, |
| proc_cpu_nnice_time|8|2, |
| proc_mem_virt, |
| proc_mem_res, |
| proc_thread_count, |
| proc_io_byte_rate |
| } |
| } |
|
上述のコマンドを実行すると、メモリ計測の結果が以下のようにファイルに出力されます。
| ----- 20:15:37 (proc name, pid, cpu, negnice cpu, VSS,
RSS, thread #, I/O) |
| java 6390 93.33 0.00 787.9mb 389.7mb 2438 0.0 |
| java 6370 88.66 0.00 788.9mb 308.3mb 2444 0.0 |
| ----- 20:15:38 (proc name, pid, cpu, negnice cpu, VSS,
RSS, thread #, I/O) |
| java 6390 80.00 0.00 793.8mb 389.7mb 2482 0.0 |
| java 6370 74.66 0.00 794.7mb 308.3mb 2488 0.0 |
| <以下略> |
|
ここでは、VSSのサイズが継続的に増加していることがわかります。
メモリ・リークを検出する手段としては、Glance/gpm以外にも以下のような方法があります。
- JVMオプション-Xverboseegcから得られるログを解析する
- HPjmeterによるメモリ・リークの解析
- gdb(gnu debugger)を用いる
|
以上、今回はJavaプログラムによるメソッド・コールの調査、そしてメモリ・リークの発見について説明しました。次回は引き続き、HPjmeterによるメモリ・リークの解析について詳しく説明します。 |