jmap
コマンド行ユーティリティは、実行中のVMまたはコア・ファイルのメモリー関係の統計を出力します。
このユーティリティは、jsadebugd
デーモンを使ってリモート・マシン上のプロセスやコア・ファイルを照会することもできます。注意: この場合、出力に時間がかかります。
このリリースのJDK 8では、JVMおよびJavaアプリケーションに関する問題を診断するため、Java Mission Control、Java Flight Recorderおよびjcmd
ユーティリティが導入されています。診断機能を強化し、パフォーマンスのオーバーヘッドを削減するには、以前のjmap
ユーティリティのかわりに最新のユーティリティjcmd
の使用をお薦めします。
プロセスまたはコア・ファイルでコマンド行オプションなしでjmap
を使用された場合、ロードされた共有オブジェクトの一覧が出力されます(出力はOracle Solarisオペレーティング・システムのpmap
ユーティリティに似ています)。より詳細な情報を得るために、オプション-heap
、-histo
、または-permstat
を使用できます。これらのオプションについては、以降の各サブセクションで説明します。
さらに、JDK 7リリースで導入された-dump:format=b,file=
filenameオプションを使用すると、jmap
によって、Javaヒープが指定されたファイルにバイナリHPROF形式でダンプされます。その後、jhat
ツールを使ってこのファイルを解析できます。
ハングアップ・プロセスが原因でjmap
pidコマンドが反応しない場合は、-F
オプションを使用して(Oracle SolarisおよびLinuxオペレーティング・システムのみ) Serviceability Agentの使用を強制することができます。
jmap
ユーティリティの詳細は、jmap
コマンドのマニュアル・ページを参照してください。
次の項では、jmap
コマンドの使用方法およびトラブルシューティング手法について説明し、実行中のVMまたはコア・ファイルのメモリー関連の統計情報を出力する例を示します。
次のJavaヒープ情報を取得するために、-heap
オプションが使用されます。
ガベージ・コレクション(GC)アルゴリズムに固有の情報。GCアルゴリズムの名前(パラレルGCなど)やアルゴリズム固有の詳細(パラレルGCのスレッド数など)が含まれます。
コマンド行オプションとして指定されたか、またはマシンの構成に基づいてVMによって選択された可能性のあるヒープ構成。
ヒープ使用量のサマリー: このツールは、各世代(ヒープ領域)について、合計ヒープ容量、使用中のメモリー、および使用可能な空きメモリーを出力します。領域の集まりとして構成された世代(New世代など)では、領域固有のメモリー・サイズ・サマリーが含まれます。
例2-22は、jmap -heap
コマンドの出力を示しています。
例2-22 jmap -heapコマンドからのJavaヒープの情報
$ jmap -heap 29620
Attaching to process ID 29620, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.6.0-rc-b100
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 67108864 (64.0MB)
NewSize = 2228224 (2.125MB)
MaxNewSize = 4294901760 (4095.9375MB)
OldSize = 4194304 (4.0MB)
NewRatio = 8
SurvivorRatio = 8
PermSize = 12582912 (12.0MB)
MaxPermSize = 67108864 (64.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 2031616 (1.9375MB)
used = 70984 (0.06769561767578125MB)
free = 1960632 (1.8698043823242188MB)
3.4939673639112905% used
Eden Space:
capacity = 1835008 (1.75MB)
used = 36152 (0.03447723388671875MB)
free = 1798856 (1.7155227661132812MB)
1.9701276506696428% used
From Space:
capacity = 196608 (0.1875MB)
used = 34832 (0.0332183837890625MB)
free = 161776 (0.1542816162109375MB)
17.716471354166668% used
To Space:
capacity = 196608 (0.1875MB)
used = 0 (0.0MB)
free = 196608 (0.1875MB)
0.0% used
tenured generation:
capacity = 15966208 (15.2265625MB)
used = 9577760 (9.134063720703125MB)
free = 6388448 (6.092498779296875MB)
59.98769400974859% used
Perm Generation:
capacity = 12582912 (12.0MB)
used = 1469408 (1.401336669921875MB)
free = 11113504 (10.598663330078125MB)
11.677805582682291% used
jmap
コマンドに-histo
オプションを指定すると、クラス固有のヒープ・ヒストグラムを取得できます。指定されたパラメータに応じて、jmap -histo
コマンドは実行中のプロセスまたはコア・ファイルのヒープ・ヒストグラムを出力できます。
実行中のプロセスに対してコマンドが実行されると、ツールはクラスごとにオブジェクト数、メモリー・サイズ(バイト)、および完全修飾クラス名を出力します。Java HotSpot VMの内部クラスは山カッコで囲まれます。ヒストグラムは、ヒープがどのように使われているかを理解するのに役立ちます。オブジェクトのサイズを得るには、合計サイズをそのオブジェクト型の数で割る必要があります。
例2-23は、PID番号29620を持つプロセスでjmap -histo
コマンドを実行した場合の出力を示しています。
例2-23 プロセスのJavaヒープのクラス固有のヒストグラム
$ jmap -histo 29620
num #instances #bytes class name
--------------------------------------
1: 1414 6013016 [I
2: 793 482888 [B
3: 2502 334928 <constMethodKlass>
4: 280 274976 <instanceKlassKlass>
5: 324 227152 [D
6: 2502 200896 <methodKlass>
7: 2094 187496 [C
8: 280 172248 <constantPoolKlass>
9: 3767 139000 [Ljava.lang.Object;
10: 260 122416 <constantPoolCacheKlass>
11: 3304 112864 <symbolKlass>
12: 160 72960 java2d.Tools$3
13: 192 61440 <objArrayKlassKlass>
14: 219 55640 [F
15: 2114 50736 java.lang.String
16: 2079 49896 java.util.HashMap$Entry
17: 528 48344 [S
18: 1940 46560 java.util.Hashtable$Entry
19: 481 46176 java.lang.Class
20: 92 43424 javax.swing.plaf.metal.MetalScrollButton
... more lines removed here to reduce output...
1118: 1 8 java.util.Hashtable$EmptyIterator
1119: 1 8 sun.java2d.pipe.SolidTextRenderer
Total 61297 10152040
コア・ファイルに対してjmap -histo
コマンドが実行された場合、ツールはクラスごとにサイズ、カウント、クラス名を出力します。Java HotSpot VMの内部クラスには、先頭にアスタリスク(*)が付けられます。
例2-24は、jmap -histo
コマンドをコア・ファイルで実行した場合の出力を示しています。
例2-24 コア・ファイルのJavaヒープのヒストグラム
$ jmap -histo /usr/bin/java core Attaching to core core from executable /usr/bin/java, please wait... Debugger attached successfully. Server compiler detected. JVM version is 1.6.0-rc-b100 Iterating over heap. This may take a while... Heap traversal took 8.902 seconds. Object Histogram: Size Count Class description ------------------------------------------------------- 4151816 2941 int[] 2997816 26403 * ConstMethodKlass 2118728 26403 * MethodKlass 1613184 39750 * SymbolKlass 1268896 2011 * ConstantPoolKlass 1097040 2011 * InstanceKlassKlass 882048 1906 * ConstantPoolCacheKlass 758424 7572 char[] 733776 2518 byte[] 252240 3260 short[] 214944 2239 java.lang.Class 177448 3341 * System ObjArray 176832 7368 java.lang.String 137792 3756 java.lang.Object[] 121744 74 long[] 72960 160 java2d.Tools$3 63680 199 * ObjArrayKlassKlass 53264 158 float[] ... more lines removed here to reduce output...
jmap
コマンドを-clstats
オプションとともに使用して、Javaヒープのクラス・ローダー統計を出力します。
jmap
コマンドは、プロセスIDを使用して実行中のプロセスに接続し、メタスペースにロードされたクラスに関する詳細情報を出力します。
次の例は、16624というPID番号を持つプロセスに対してjmap -clstats
コマンドを実行した場合の出力を示しています。
$ jmap -clstats 16624 Attaching to process ID 16624, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.211-b12 finding class loader instances ..done. computing per loader stat ..done. please wait.. computing liveness.liveness analysis may be inaccurate ... class_loader classes bytes parent_loader alive? type <bootstrap> 982 1845411 null live <internal> 0x000000076f5081e0 1948 3133806 null dead sun/misc/Launcher$ExtClassLoader@0x00000007c000fc80 0x000000076e13d3d0 1 1481 null dead sun/reflect/DelegatingClassLoader@0x00000007c000a028 0x000000076ca9e100 0 0 0x000000076f510178 dead java/util/ResourceBundle$RBClassLoader@0x00000007c01ade48 0x000000076f510178 38 94160 0x000000076f5081e0 dead sun/misc/Launcher$AppClassLoader@0x00000007c000f8d8 total = 5 2969 5074858 N/A alive=1, dead=4 N/A