いつも忘れるのでメモ、前提としてjava(JVM)の起動オプションでjmxremoteを有効にしておくのと「cmdline-jmxclient」を使うのでダウンロードしておく。ヒープの状況を把握するには以下のことをやっておく。
- ヒープ構造の確認
- Memoryの確認
- Meorypoolの確認
■ヒープ構造の確認
cmdline-jmxclientでjavaの色々な項目を見ることができるが、ヒープは「Memory」または「Memory Pool」の名称が含まれているものを調べることで構造を確認できる。javaのバージョンによってヒープの構造が違うことがある(`あったような気がする)ので確認しておく。以下実行例、cmdline-jmxclientの結果を「Memory」でgrepしている。
#実行例 $ java -jar cmdline-jmxclient-0.10.3.jar - localhost:12345 | grep Memory ※localhost:12345の箇所は、ホスト名 or IP:JMXポート番号になる #↓結果例 java.lang:type=Memory java.lang:name=Metaspace,type=MemoryPool java.lang:name=Eden Space,type=MemoryPool java.lang:name=Survivor Space,type=MemoryPool java.lang:name=Metaspace Manager,type=MemoryManager java.lang:name=Compressed Class Space,type=MemoryPool java.lang:name=CodeCacheManager,type=MemoryManager java.lang:name=Code Cache,type=MemoryPool java.lang:name=Tenured Gen,type=MemoryPool
上記の結果だとMemoryが1件とMemoryPoolが6件ある。MemoryPoolは複数あるのが普通、以降でこれらの状態確認方法を説明する。
■Memoryの確認
Memoryの使用状況はまずMemoryのAttribute一覧を出力し、一覧からサイズに関連ありそうな項目の目星をつけてそのAttributeの値を呼び出して内容を確認する。※Attributeが予めわかっている場合は一覧の出力は不要
#MemoryのAttribute の確認 java -jar cmdline-jmxclient-0.10.3.jar - localhost:12345 "java.lang:type=Memory" #結果例 Attributes: ObjectPendingFinalizationCount: ObjectPendingFinalizationCount (type=int) HeapMemoryUsage: HeapMemoryUsage (type=javax.management.openmbean.CompositeData) NonHeapMemoryUsage: NonHeapMemoryUsage (type=javax.management.openmbean.CompositeData) Verbose: Verbose (type=boolean) ObjectName: ObjectName (type=javax.management.ObjectName) Operations: gc: gc Parameters 0, return type=void
名前から「HeapMemoryUsage」と「NonHeapMemoryUsage」がサイズに関係してそうなのでこれらの中身を確認する。以下はHeapMemoryUsageを確認する例
#実行例 java -jar cmdline-jmxclient-0.10.3.jar - localhost:12345 java.lang:type=Memory HeapMemoryUsage 12/13/2020 05:25:46 +0900 org.archive.jmx.Client HeapMemoryUsage: committed: 22740992 init: 16777216 max: 251396096 used: 13061928
結果から上限(max)、使用(used)が`わかる(単位はByte)。「NonHeapMemoryUsage」も同様の手順で使用状況を確認できる。
■MemoryPoolの確認
MemoryPoolのヒープが幾つか表示されるが、その中から「Survivor」領域を見るには以下のようにする、Memoryのときと同じくAttribute一覧から使用サイズっぽいのを選んで表示させる。
$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:12345 "java.lang:name=Survivor Space,type=MemoryPool" 結果 Attributes: Valid: Valid (type=boolean) Usage: Usage (type=javax.management.openmbean.CompositeData) ~中略~ Parameters 0, return type=void Attributes:の中にUsageという項目があるこれが使用量にあたりそうなので実行 $ java -jar cmdline-jmxclient-0.10.3.jar - localhost:12345 "java.lang:name=Survivor Space,type=MemoryPool" Usage ↓結果例 12/13/2020 04:30:13 +0900 org.archive.jmx.Client Usage: committed: 786432 init: 524288 max: 8650752 used: 85856
その他の項目も同様に調べていけばヒープの使用状況が確認できます。 以上