概要

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.printVM.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}'
1
pss 143978

8. Reference