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.14.2 ヒープ・ヒストグラム

jmapコマンドに-histoオプションを指定すると、クラス固有のヒープ・ヒストグラムを取得できます。指定されたパラメータに応じて、jmap -histoコマンドは実行中のプロセスまたはコア・ファイルのヒープ・ヒストグラムを出力できます。

実行中のプロセスに対してコマンドが実行されると、ツールはクラスごとにオブジェクト数、メモリー・サイズ(バイト)、および完全修飾クラス名を出力します。Java HotSpot VMの内部クラスは山カッコで囲まれます。ヒストグラムは、ヒープがどのように使われているかを理解するのに役立ちます。オブジェクトのサイズを得るには、合計サイズをそのオブジェクト型の数で割る必要があります。

例2-23は、PID番号29620を持つプロセスでjmap -histoコマンドを実行した場合の出力を示しています。

コア・ファイルに対してjmap -histoコマンドが実行された場合、ツールはクラスごとにサイズ、カウント、クラス名を出力します。Java HotSpot VMの内部クラスには、先頭にアスタリスク(*)が付けられます。

例2-24は、jmap -histoコマンドをコア・ファイルで実行した場合の出力を示しています。

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, 2020, Oracle and/or its affiliates. All rights reserved.