実行時間の長いサーバーアプリケーションに、Javaで一般的なGCパフォーマンスの数値を定期的に出力させたいと思います。これは、Runtime.freeMemory()に相当するGCのようなものです。実行されたサイクル数、平均時間などです。
誤って構成されたメモリプールが過剰なGCの頻度と長さを引き起こしている疑いがあるお客様のマシンでシステムを実行しています。一般に、基本的なGCアクティビティを定期的に報告するのがよいと思います。
これを行うためのプラットフォームに依存しない方法はありますか?
編集:実行中にこのデータをシステムログ(コンソール)に出力したいのですが、これはJConsoleやJVisualVMのようにJVMに接続したいものではありません。
Edit2:MX Beanは私が望むもののように見えます-誰かがこれらの1つを取得する実用的なコード例を持っていますか?
GarbageCollectorMXBean
を使用してGC統計を出力する例を次に示します。おそらく、このメソッドを定期的に呼び出すでしょう。 ScheduledExecutorService
を使用したスケジューリング。
public void printGCStats() {
long totalGarbageCollections = 0;
long garbageCollectionTime = 0;
for(GarbageCollectorMXBean gc :
ManagementFactory.getGarbageCollectorMXBeans()) {
long count = gc.getCollectionCount();
if(count >= 0) {
totalGarbageCollections += count;
}
long time = gc.getCollectionTime();
if(time >= 0) {
garbageCollectionTime += time;
}
}
System.out.println("Total Garbage Collections: "
+ totalGarbageCollections);
System.out.println("Total Garbage Collection Time (ms): "
+ garbageCollectionTime);
}
GarbageCollectorMXBean を参照してください。
-XX:-PrintGC
と-XX:-PrintGCDetails
を試してください。 VMデバッグオプション を参照してください。
トピックから少し外れていますが、VisualVMとJConsoleを実行中のアプリケーションに接続して、有用な統計を確認できます。