ab’s blog

インフラの呟きです。

java ヒープ使用状況をコマンドラインで確認

hahahahahaha

いつも忘れるのでメモ、前提としてjavaJVM)の起動オプションでjmxremoteを有効にしておくのと「cmdline-jmxclient」を使うのでダウンロードしておく。ヒープの状況を把握するには以下のことをやっておく。

  1. ヒープ構造の確認
  2. Memoryの確認
  3. 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

その他の項目も同様に調べていけばヒープの使用状況が確認できます。 以上