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 Permanent世代の統計

Permanent世代は、クラスやメソッド・オブジェクトなどの仮想マシン自体を反映したデータをすべて保持するヒープ領域です。この領域は、『Java仮想マシン仕様』では「メソッド領域」とも呼ばれます。

非常に多くのクラスを動的に生成してロードするアプリケーション(Java Server PagesやWebコンテナなど)では、Permanent世代のサイズの構成が重要になる可能性があります。アプリケーションでロードされたクラスが多すぎた場合、そのアプリケーションは次のエラーで終了する可能性があります。

Exception in thread thread_name java.lang.OutOfMemoryError: PermGen space

これの説明および他の種類のOutOfMemoryError例外の詳細は、「OutOfMemoryError例外の理解」を参照してください。

Permanent世代に関する詳細情報を得るには、jmapコマンドの-permstatオプションを使ってPermanent世代内のオブジェクトの統計を出力できます。

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

例2-25 プロセスのJavaヒープのPermanent世代の統計情報

$ jmap -permstat 29620
Attaching to process ID 29620, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.6.0-rc-b100
12674 intern Strings occupying 1082616 bytes.
finding class loader instances ..Unknown oop at 0xd0400900
Oop's klass is 0xd0bf8408
Unknown oop at 0xd0401100
Oop's klass is null
done.
computing per loader stat ..done.
please wait.. computing liveness.........................................done.
class_loader    classes bytes   parent_loader   alive?  type

<bootstrap>     1846 5321080  null        live   <internal>
0xd0bf3828  0      0      null         live    sun/misc/Launcher$ExtClassLoader@0xd8c98c78
0xd0d2f370  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0c99280  1   1440      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0b71d90  0      0   0xd0b5b9c0    live java/util/ResourceBundle$RBClassLoader@0xd8d042e8
0xd0d2f4c0  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0b5bf98  1    920   0xd0b5bf38      dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0c99248  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f488  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0b5bf38  6   11832  0xd0b5b9c0      dead    sun/reflect/misc/MethodUtil@0xd8e8e560
0xd0d2f338  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f418  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f3a8  1    904     null          dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0b5b9c0  317 1397448 0xd0bf3828     live    sun/misc/Launcher$AppClassLoader@0xd8cb83d8
0xd0d2f300  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f3e0  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0ec3968  1   1440      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0e0a248  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0c99210  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f450  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0d2f4f8  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50
0xd0e0a280  1    904      null         dead    sun/reflect/DelegatingClassLoader@0xd8c22f50

total = 22      2186    6746816   N/A   alive=4, dead=18       N/A    

クラス・ローダー・オブジェクトごとに次の詳細が出力されます。

  • クラス・ローダー・オブジェクトのアドレス(ユーティリティが実行されたスナップショット時点)

  • ロードされたクラスの数

  • このクラス・ローダーによってロードされたすべてのクラスのメタデータで消費されているバイト数(概算)

  • 親クラス・ローダー(存在する場合)のアドレス

  • ローダー・オブジェクトが将来ガベージ・コレクトされるかどうかを示すliveまたはdeadの表示

  • このクラス・ローダーのクラス名

目次      

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