1. 概要

ガベージコレクションは、自動メモリ管理を提供するJavaプログラミング言語の驚異です。 ガベージコレクションは、メモリの手動割り当てと割り当て解除の詳細を隠します。 このメカニズムは素晴らしいものですが、私たちが望むように機能しない場合があります。 このチュートリアルでは、Javaのガベージコレクション統計のログオプションを調べ、これらの統計をファイルにリダイレクトする方法を見つけます。

2. Java8以前のGCロギングフラグ

まず、Java9より前のJavaバージョンでのGCロギングに関連するJVMフラグを調べてみましょう。

2.1. -XX:+ PrintGC

-XX:+ PrintGC フラグは、 -verbose:gc のエイリアスであり、は基本的なGCロギングをオンにします。 このモードでは、すべての若い世代とすべてのフル世代のコレクションに対して1行が印刷されます。 ここで、詳細なGC情報の提供に注意を向けましょう。

2.2. -XX:+ PrintGCDetails

同様に、 -XX:+ PrintGC の代わりに詳細なGCロギングをアクティブ化するために使用されるフラグ-XX:+PrintGCDetailsがあります。

-XX:+ PrintGCDetails からの出力は、使用しているGCアルゴリズムによって異なることに注意してください。

次に、ログに日付と時刻の情報で注釈を付ける方法を見ていきます。

2.3. -XX:+ PrintGCDateStampsおよび-XX:+ PrintGCTimeStamps

フラグ-XX:+ PrintGCDateStamps-XX:+ PrintGCTimeStamps をそれぞれ利用して、日付とタイミング情報をGCログに追加できます。

まず、 -XX:+ PrintGCDateStamps は、ログエントリの日付と時刻を各行の先頭に追加します。

次に、 -XX:PrintGCTimeStamps は、JVMが開始されてから経過した時間(秒単位)の詳細を示すタイムスタンプをログのすべての行に追加します。

2.4. -Xloggc

最後に、GCログをファイルにリダイレクトします。 このフラグは、構文 -Xloggc:file を使用して引数としてオプションのファイル名を取り、ファイル名がない場合、GCログは標準出力に書き込まれます。

さらに、このフラグは -XX:PrintGC および-XX:PrintGCTimestampsフラグも設定します。 いくつかの例を見てみましょう:

GCログを標準出力に書き込みたい場合は、次を実行できます。

java -cp $CLASSPATH -Xloggc mypackage.MainClass

または、GCログをファイルに書き込むには、次のコマンドを実行します。

java -cp $CLASSPATH -Xloggc:/tmp/gc.log mypackage.MainClass

3. Java9以降のGCロギングフラグ

Java 9以降では、 -verbose:gc のエイリアスである-XX:PrintGC は非推奨になり、統合ロギングオプション-Xlogが採用されました。 上記の他のすべてのGCフラグは、Java9以降でも引き続き有効です。 この新しいロギングオプションを使用すると、表示するメッセージを指定し、ログレベルを設定し、出力をリダイレクトすることができます

以下のコマンドを実行して、ログレベル、ログデコレータ、およびタグセットで使用可能なすべてのオプションを確認できます。

java -Xlog:logging=debug -version

たとえば、すべてのGCメッセージをファイルに記録する場合は、次のコマンドを実行します。

java -cp $CLASSPATH -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass

さらに、この新しい統合ログフラグは繰り返し可能であるため、たとえば、すべてのGCメッセージを標準出力とファイルの両方にログに記録できます。

java -cp $CLASSPATH -Xlog:gc*=debug:stdout -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass

4. 結論

この記事では、ガベージコレクションの出力をJava8とJava9+の両方でログに記録する方法と、その出力をファイルにリダイレクトする方法を示しました。