Java Platform, Standard Editionトラブルシューティング・ガイド
目次      

2.14 jmapユーティリティ

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またはコア・ファイルのメモリー関連の統計情報を出力する例を示します。

2.14.1 ヒープの構成と使用量

次の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

2.14.2 ヒープ・ヒストグラム

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...

2.14.3 クラス・ローダーの統計

jmapコマンドを-clstatsオプションとともに使用して、Javaヒープのクラス・ローダー統計を出力します。

jmapコマンドは、プロセスIDを使用して実行中のプロセスに接続し、メタスペースにロードされたクラスに関する詳細情報を出力します。

  • class_loader: クラス・ローダー・オブジェクトのアドレス(ユーティリティが実行されたスナップショット時点)
  • classes: ロードされたクラスの数
  • bytes: このクラス・ローダーによってロードされたすべてのクラスのメタデータで消費されているバイト数(概算)
  • parent_loader: 親クラス・ローダー(存在する場合)のアドレス
  • alive?:ローダー・オブジェクトが将来ガベージ・コレクトされるかどうかを示すliveまたはdeadマーク
  • type: このクラス・ローダーのクラス名

次の例は、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
目次      

Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved.