16

Java サーバー アプリケーションをテストしているとします。私はテストを終えるのにどれくらいの時間がかかるか知っています。そのテスト中に GC に費やされた金額を知りたいと思います。どうすればいいですか?

4

7 に答える 7

25

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;
}
于 2012-12-17T13:50:31.953 に答える
7

最も簡単な方法は、JVM の起動時に オプション-Xloggcとオプションを使用することです。-XX:-PrintGCTimeStampsガベージコレクションにかかる時間を出力すると思います。

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

于 2012-12-17T13:50:04.177 に答える
4

別の便利な解決策は、テストが完了したときにプロセスに対してjstat -gc( documentation ) を実行することです。これにより、JVM の存続期間中に GC で費やされた正確な時間を集計した出力が得られます。

于 2012-12-19T22:15:22.673 に答える
4

このパフォーマンス メトリックは JVM によって記録され、JMX を介してアクセスできるようになります。インタラクティブな監視を行うには、JConsole を使用して実行中の JVM に接続し、[VM の概要] タブに次のように表示されます。

ガベージ コレクター: 名前 = 'Copy'、コレクション = 26、合計消費時間 = 0.183 秒 ガベージ コレクター: 名前 = 'MarkSweepCompact'、コレクション = 2、合計消費時間 = 0.168 秒

プログラムで JMX を照会することもできます。

于 2012-12-17T13:51:19.077 に答える
1

ManagementFactoryを使用する @Steve McLeod の回答と同様に、Java 8 以降、これはJava ストリームを使用して 1 行で記述することもできます。

long collectionTime = ManagementFactory.getGarbageCollectorMXBeans().stream().mapToLong(mxBean -> mxBean.getCollectionTime()).sum();
于 2017-09-26T07:37:31.540 に答える
1

ガベージ コレクション ログを有効にします。文書化されているよう-verbose:gcに、、-XX:+PrintGCDetailsおよび-XX:+PrintGCTimeStampsフラグを使用できます。-Xloggcフラグを使用して、それらをファイルに送信できます。

結果のログは人間が判読できますが、ほとんどの場合、アナライザーで実行することをお勧めします。そのようなツールは、このスレッドにリストされています。

于 2012-12-17T13:50:58.547 に答える
1

異なる動作をするさまざまな GC アルゴリズムがあります。私は最近、このテーマに関する優れた記事を読みました。詳しく知りたい場合は、この記事をお勧めします。

次のコマンド ライン オプションを使用してアプリケーションを起動し、-verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetailsGC に関する情報を取得できます。

ログ メッセージの例を次に示します。

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 秒] ]

于 2012-12-17T13:51:21.453 に答える