Java サーバー アプリケーションをテストしているとします。私はテストを終えるのにどれくらいの時間がかかるか知っています。そのテスト中に GC に費やされた金額を知りたいと思います。どうすればいいですか?
7 に答える
GC (ガベージ コレクター) が動作しているときにアプリケーションが停止し、GC が終了すると再開すると思います。
それは安全な仮定ではないと思います。ガベージ コレクターがアプリケーション コードと並行して動作していませんか?
ガベージ コレクションに費やされた時間を測定するには、ガベージ コレクタ MXBeanにクエリを実行できます。
これを試して:
public static void main(String[] args) {
System.out.println("collectionTime = " + getGarbageCollectionTime());
}
private static long getGarbageCollectionTime() {
long collectionTime = 0;
for (GarbageCollectorMXBean garbageCollectorMXBean : ManagementFactory.getGarbageCollectorMXBeans()) {
collectionTime += garbageCollectorMXBean.getCollectionTime();
}
return collectionTime;
}
最も簡単な方法は、JVM の起動時に オプション-Xloggc
とオプションを使用することです。-XX:-PrintGCTimeStamps
ガベージコレクションにかかる時間を出力すると思います。
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
別の便利な解決策は、テストが完了したときにプロセスに対してjstat -gc
( documentation ) を実行することです。これにより、JVM の存続期間中に GC で費やされた正確な時間を集計した出力が得られます。
このパフォーマンス メトリックは JVM によって記録され、JMX を介してアクセスできるようになります。インタラクティブな監視を行うには、JConsole を使用して実行中の JVM に接続し、[VM の概要] タブに次のように表示されます。
ガベージ コレクター: 名前 = 'Copy'、コレクション = 26、合計消費時間 = 0.183 秒 ガベージ コレクター: 名前 = 'MarkSweepCompact'、コレクション = 2、合計消費時間 = 0.168 秒
プログラムで JMX を照会することもできます。
ManagementFactoryを使用する @Steve McLeod の回答と同様に、Java 8 以降、これはJava ストリームを使用して 1 行で記述することもできます。
long collectionTime = ManagementFactory.getGarbageCollectorMXBeans().stream().mapToLong(mxBean -> mxBean.getCollectionTime()).sum();
異なる動作をするさまざまな GC アルゴリズムがあります。私は最近、このテーマに関する優れた記事を読みました。詳しく知りたい場合は、この記事をお勧めします。
次のコマンド ライン オプションを使用してアプリケーションを起動し、-verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails
GC に関する情報を取得できます。
ログ メッセージの例を次に示します。
2012-12-17T03:02:15.590-0500: [GC [PSYoungGen: 40934K->2670K(29440K)] 48211K->14511K(73152K), 0.5745260 秒] [時間: user=0.08 sys=0.01, real=0.58 秒] ]