9 ネイティブ・メモリー・トラッキング
この章では、ネイティブ・メモリー・トラッキング(NMT)機能について説明します。NMTは、HotSpot VMの内部メモリー使用状況を追跡するJava HotSpot VM機能です。NMTデータは、jcmd
ユーティリティを使用してアクセスできます。NMTは、サードパーティ・ネイティブ・コードおよびOracle Java Development Kit (JDK)クラス・ライブラリのメモリー割当てを追跡しません。NMTは、Java Mission Control (JMC)のHotSpotにNMTのMBean
を含めません。
主な機能
jcmd
でネイティブ・メモリー・トラッキングを使用する場合、Java仮想マシン(JVM)またはHotSpot VMのメモリー使用状況を異なるレベルで追跡できます。NMTは、JVMまたはHotSpot VMが使用するメモリーのみを追跡し、ユーザーのネイティブ・メモリーは追跡しません。NMTは、クラス・データ共有(CDS)アーカイブによって使用されるメモリーの完全な情報は提供しません。
HotSpot VMのNMTは、デフォルトでオフになっています。NMTをオンにするには、JVMコマンドライン・オプションを使用します。高度なランタイム・オプションの詳細は、Java Development Kitツール仕様のjavaに関する項を参照してください。
NMTは、jcmd
ユーティリティを使用してアクセスできます。jcmdを使用したNMTデータへのアクセスを参照してください。jcmd
ユーティリティを使用してNMTを停止できますが、jcmd
ユーティリティを使用してNMTを起動または再起動することはできません。
NMTでは次の機能がサポートされています。
-
サマリー・レポートおよび詳細レポートの生成。
-
後の比較のための初期のベースラインの設定。
-
JVMコマンドライン・オプションによるJVM終了時のメモリー使用量レポートの要求。「VM終了時のNMT」を参照してください。
ネイティブ・メモリー・トラッキングの使用
NMTデータにアクセスするには、NMTを有効にしてから、jcmd
ユーティリティを使用する必要があります。
NMTの有効化
NMTを有効にするには、次のコマンドライン・オプションを使用します。
-XX:NativeMemoryTracking=[off | summary | detail]
ノート:
NMTを有効にすると、5-10%のパフォーマンス・オーバーヘッドが発生します。次の表に、NMTコマンドラインの使用オプションを示します。
表9-1 NMTの使用オプション
NMTのオプション | 説明 |
---|---|
off |
NMTはデフォルトで |
summary |
サブシステム別に集約されたメモリー使用量のみ収集します。 |
detail |
個々のコール・サイト別のメモリー使用量を収集します。 |
jcmdを使用したNMTデータへのアクセス
jcmd
を使用して収集したデータをダンプし、必要に応じて、そのデータを最後のベースラインと比較します。
jcmd <pid> VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]
表9-2 jcmdのNMTオプション
jcmdのNMTオプション | 説明 |
---|---|
summary |
カテゴリ別に集約されたサマリーを出力します。 |
detail |
|
baseline |
比較のために新しいメモリー使用量スナップショットを作成します。 |
summary.diff |
最後のベースラインに照らして新しいサマリー・レポートを出力します。 |
detail.diff |
最後のベースラインに照らして新しい詳細レポートを出力します。 |
shutdown |
NMTを停止します。 |
VM終了時のNMTデータの取得
ネイティブ・メモリー・トラッキングが有効になっている場合、VMの終了時に最後のメモリー使用量のデータを取得するには、次のVM診断コマンドライン・オプションを使用します。詳細レベルは、トラッキング・レベルに基づいています。
-XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics
VMの内部メモリー割当てをモニターし、VMのメモリー・リークを診断する方法は、Java Platform, Standard Editionトラブルシューティング・ガイドのネイティブ・メモリー・トラッキングを参照してください。