JVM ランタイムメトリクス
最終更新日 2024年12月09日(月)
Table of Contents
JVM ランタイムメトリクス機能を使用すると、Java 仮想マシン (JVM) の内部で実行される任意のアプリについて、ヒープメモリとヒープ以外のメモリのほかガベージコレクションアクティビティを表示できます。これには、Java、Clojure、Gradle、Lein、Maven、Scala、JRuby で記述されたアプリが含まれます (ただし、これに限定されません)。
JVM ランタイムメトリクスは、eco
dyno を除くすべての dyno で使用できます。
一般的な情報
言語固有のメトリクスに関する一般的な情報については、言語ランタイムメトリクスの親ドキュメントを参照してください。
はじめに
「Enhanced Language Metrics」 (拡張言語メトリクス) 機能を有効にしたら (この手順)に従います)、空のコミットを使用してアプリケーションを再デプロイします。
$ git commit --allow-empty -m "Enable Heroku Metrics"
$ git push heroku master
その後、アプリケーションは JVM のメモリメトリクスのエクスポートを開始します。
使用可能なメトリクス
上記の手順が完了した後、これらのメトリクスが使用可能になるまでに数分かかることがあります。
Heap Memory Usage (ヒープメモリ使用量)
このグラフには、現在選択されているプロセスタイプのすべての dyno にわたる全体的なメモリ割り当てと最大のヒープメモリ使用量が MB 単位でプロットされます。選択された時間間隔のサマリー指標 (最新、平均、最大メモリなど) も表示されます。
このグラフを使用する方法
ヒープメモリは、動的に割り当てられたメモリが存在する場所です。ヒープメモリが予期せず増大している場合、一般的にメモリリークを示しています。Heroku Java CLI などのツールを使用して、詳しく診断することができます。
ヒープ以外のメモリ使用量
このグラフには、現在選択されているプロセスタイプのすべての dyno にわたる全体的なメモリ割り当て (注: メモリ割り当ての時系列はこのスクリーンショットではオフに切り替えられています)、最大のヒープ以外のメモリ使用量、最大のバッファプール直接メモリ使用量、最大のバッファプールマップ済みメモリ使用量が MB 単位でプロットされます。選択された時間間隔のサマリー指標 (最新、平均、最大メモリなど) も表示されます。
バッファプールマップ済みと直接時系列は、選択された時間枠でそれらの種類のメモリ使用量がある場合にのみ表示されます。
このグラフを使用する方法
ヒープ以外のメモリ使用量のグラフは、メモリリークまたは Metaspace およびバッファプールの過剰な消費を特定するために使用できます。これらの種類の問題のデバッグについての詳細は、「Java アプリケーションでのメモリ問題のトラブルシューティング」を参照してください。
Aggregate Time Spent in Garbage Collection (ガベージコレクションに費やされた合計時間)
このグラフには、各ロールアップ中にガベージコレクションの実行に費やされた合計時間が、新しい世代と古い世代に分類されてプロットされます。凡例には、ロールアップでガベージコレクターの実行に費やされた時間の割合の内訳が表示されます。
Aggregate Garbage Collections (合計ガベージコレクション)
このグラフには、各ロールアップ中にガベージコレクターが実行した合計回数が、新しい世代と古い世代に分類されてプロットされます。
これらのグラフを使用する方法
ガベージコレクションのグラフは、GC とヒープの両方を調整するのに使用できます。多くのパフォーマンスの問題と同じように、ヒープサイズの選択は、バランスの問題です。ヒープが小さすぎると、プログラムでは GC の実行に時間がかかりすぎます。しかし、ヒープが非常に大きいと、それらの一時停止の期間が増加します。確かな経験則としては、完全な GC の後に GC グラフが示す占有率が 30% になるようヒープのサイズを設定することです。
パフォーマンス上の影響
言語固有のランタイムに関する指標では、dyno 上で実行する JVM からデータが収集されます。JVM メトリクスの収集がアプリケーションのパフォーマンスに及ぼす全般的な影響は最小限です。テストでは、以下のことが観察されています。
- ピークヒープ使用量が推定で 1MB 増加
- 約 200 のクラスが追加でロードされ、Metaspace (オフヒープ) メモリの追加は約 1MB
- 1 つの追加スレッド
JRuby との使用
この機能を JRuby と一緒に使用するには、次のように実行することによって heroku/jvm
buildpack をアプリと一緒に含める必要があります。
$ heroku buildpacks:add -i 1 heroku/jvm
その後、アプリケーションを再デプロイします。
メトリクス収集の無効化
JVM メトリクスの収集を無効にするには、単純に 「Metrics Preferences」 (メトリクスの環境設定) パネルまたは次の CLI コマンドを使用して 「Enhanced Language Metrics」 (拡張言語メトリクス) トグルをオフに切り替えます。
$ heroku labs:disable "runtime-heroku-metrics" -a "my-app-name"