概要
Javaプロセスのメモリ使用量をいろいろな方法で調査する機会あったので、まとめておきます。(内容としてはそれぞれあっさりです。)
1. GCViewer
Changelog · chewiebug/GCViewer Wikiからダウンロードする。
1
|
1. java -verbose:gc # GCログを取得する。
|
GCViewer
で確認する。
2. JMC(JDK Mission Control)
JMC 7 GA Releaseからダウンロードする。
JMC起動して、メモリを確認したいJavaプロセスを選択する。
3. jstat
1
2
|
1. tasklist | grep java # (linuxの場合はps)
2. jstat -gc <プロセス番号>
|
1
2
|
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT
0.0 2048.0 0.0 2048.0 55296.0 18432.0 37888.0 13596.4 45868.0 44628.5 5504.0 5063.0 12 0.127 0 0.000 4 0.012 0.139
|
4. jcmd
いろんなオプションがありますが、今回はPerfCounter.print
とVM.native_memory
を見てみました。
-
jcmd
: 引数なしならjps
と同じ
-
jcmd VM.uptime
: Javaプロセスの起動後の経過時間
-
jcmd Thread.print
: スレッドダンプ。jstack
と同じ。
-
jcmd GC.heap_dump
: ヒープダンプ。jmap
と同じ。
-
jcmd -gcnew 1s
: 毎秒のGC領域のサイズを見る
-
jcmd PerfCounter.print
: JVM内部で保持している様々なカウンタを取得
-
詳しくはこちらを参照。
4.1. PerfCounter.print
1
2
|
1. tasklist | grep java # (linuxの場合はps)
2. jcmd <プロセス番号> PerfCounter.print
|
4.2. VM.native_memory
1
2
3
4
|
1. java -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary
2. tasklist | grep java # (linuxの場合はps)
3. jcmd <プロセス番号> VM.native_memory baseline
4. jcmd <プロセス番号> VM.native_memory summary.diff
|
5. gcore
1
2
3
4
|
1. ps -aux | grep 'java'
2. gcore <プロセス番号>
3. strings -a core.13386 > raw.txt
4. sort raw.txt | uniq -c | sort -nr | less > data.txt
|
6. pmap
1
2
|
1. ps -aux | grep 'java'
2. pmap -x <プロセス番号>
|
7. PSS (proportional set size)
1
2
|
1. ps -aux | grep 'java'
2. cat /proc/<プロセス番号>/smaps | awk '/^Pss/{sum += $2}END{print pss sum}'
|
8. Reference