ガベージコレクションのログ記録を有効にする方法
Environment
- Java
Issue
- ガベージコレクション (GC) ログを表示したい
- JVM verbose GC ログ記録を有効にするのにベストなオプションは?
Resolution
適切な JVM オプションを追加して、ガベージコレクションのログ記録を有効にします。
OpenJDK / Sun JDK
-
次の JVM オプションは比較的軽いですが、分析およびトラブルシューティングに対して必要な情報を提供します。
-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
これは、JVM が起動してから秒/ミリ秒を示すタイムスタンプを使用して、GC アクティビティをログ記録します。
* 次の JVM オプションは、JDK 1.6 update 4 以降で使用することができます。
-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps
これは、人間が読めるタイムスタンプで、GC アクティビティのログを記録します。
-
パスを指定しない場合は、
user.dir
環境変数によって定義されたディレクトリにgc.log
が作成されます。 -
警告:
gc.log
は JVM を起動するたびに再作成されるため、JVM を再起動する場合は必ずgc.log
のバックアップを取るようにしてください。代わりに、ファイル名にタイムスタンプを追加することもできます。ファイル名は、OS やシェルによって異なります。たとえば、Linux では、-Xloggc:gc.log.`date +%Y%m%d%H%M%S`
となります。Windows では、次を使うことができます。
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
for /f "tokens=1-2 delims=/:"%%a in ("%TIME%") do (set mytime=%%a%%b)
set "JAVA_OPTS=%JAVA_OPTS% -Xloggc:C:/log/gc.log.%mydate%_%mytime%
-Xloggc
オプションを指定しないと、標準的出力に出力されます。通常、専用ファイルにログを記録するため、-Xloggc
オプションを使用することをお勧めします。
注意: 次の動画で、ガベージコレクションを有効にする方法を確認することができます。
IBM JDK
-
次の JVM オプションを追加します。
-verbose:gc -Xverbosegclog:gc.log
-
パスを指定しないと、
user.dir
環境変数で定義されているディレクトリにgc.log
が作成されます。 - 警告:
gc.log
は JVM を起動するたびに再作成されるため、JVM を再起動する場合は必ずgc.log
のバックアップを取るようにしてください。代わりに、ファイル名にタイムスタンプを追加することもできます。ファイル名は、OS やシェルによって異なります。たとえば、Linux では、-Xverbosegclog:gc.log.`date +%Y%m%d%H%M%S`
となります。Windows では、次を使うことができます。
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
for /f "tokens=1-2 delims=/:"%%a in ("%TIME%") do (set mytime=%%a%%b)
set "JAVA_OPTS=%JAVA_OPTS% -Xverbosegclog:C:/log/gc.log.%mydate%_%mytime%
JRockit JDK
次の JVM オプションを追加します。
-Xverbose:gcpause -Xverbose:memdbg -Xverboselog:gc.log
- パスを指定しないと、
user.dir
環境変数で定義されているディレクトリにgc.log
が作成されます。 - 警告:
gc.log
は JVM を起動するたびに再作成されるため、JVM を再起動する場合は必ずgc.log
のバックアップを取るようにしてください。代わりに、ファイル名にタイムスタンプを追加することもできます。ファイル名は、OS やシェルによって異なります。たとえば、Linux では、-Xverbosegclog:gc.log.`date +%Y%m%d%H%M%S`
となります。Windows では、次を使うことができます。
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
for /f "tokens=1-2 delims=/:"%%a in ("%TIME%") do (set mytime=%%a%%b)
set "JAVA_OPTS=%JAVA_OPTS% -Xverboselog:C:/log/gc.log.%mydate%_%mytime%
JBoss EAP 5 以前のバージョン
-
unix ベースの OS では、
run.sh
ではなく、run.conf
にオプションを置く必要があります。サーバーの設定ディレクトリのrun.conf
($JBOSS_HOME/server/$CONFIG/run.conf
など) は、 (JBoss EAP 5.0.0 で再発したバグのため、これ以外ではバージョン$JBOSS_HOME/bin
ディレクトリのrun.conf
よりも優先度が高くなります (5.0.1 で修正されました)。 -
Windows の場合は
run.bat
がrun.conf
を読み込まないので、オプションをrun.bat
に追加する必要があります。 boot.log
を確認して、user.dir
環境変数 ($JBOSS_HOME/bin
など) の値を確認します。環境変数は、パスを指定していないときに GC ログ記録のデフォルトの場所を指定します。-
以下のようなディレクトリに対して、JBoss の複数のインスタンスを実行する場合は、以下のようになります。
./run.sh -c node1 -b 127.0.0.1 -Djboss.messaging.ServerPeerID=1 ./run.sh -c node2 -b 127.0.0.1 -Djboss.messaging.ServerPeerID=2 -Djboss.service.binding.set=ports-01
gc.log ファイルが適切に分割されるようにするには、それぞれの $PROFILE に特有の JVM_OPTS を持つ固有の run.conf があることを確認する必要があります。たとえば node1 には、以下のような $JBOSS_HOME/server/node1/run.conf が含まれます。
JAVA_OPTS="$JAVA_OPTS -verbose:gc -Xloggc:gc_node1.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
$JBOSS_HOME/server/node2/run.conf は以下のようになります。
JAVA_OPTS="$JAVA_OPTS -verbose:gc -Xloggc:gc_node2.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
- 警告:
gc.log
は JBoss を起動するたびに再作成されるので、サーバーを再起動する場合にgc.log
のバックアップを取るようにしてください。代わりに、ファイル名にタイムスタンプを追加することもできます。ファイル名は、OS またはシェルによって異なります。たとえば、Linux で OpenJDK または Oracle/Sun JDK の場合は、-Xloggc:gc.log.`date +%Y%m%d%H%M%S`
のようになります。Windows では、次を使うことができます。
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
for /f "tokens=1-2 delims=/:"%%a in ("%TIME%") do (set mytime=%%a%%b)
set "JAVA_OPTS=%JAVA_OPTS% -Xloggc:C:/log/gv.log.%mydate%_%mytime%
JBoss EAP 6
オプションの指定は、起動させるモードによって異なります。
Standalone モード:
- Unix 系 OS の場合、 standalone.conf に追記してください.
- Windows OS の場合、 standalone.conf.bat に追記してください.
Domain モード:
ドメインモードの場合、どの java プロセスのGCログを取得するのか考慮しなくていはいけません。多くの場合、同一ホスト上に、プロセスコントローラー、ホストコントローラー(ドメインがシングルホストで構成されている場合はドメインコントローラー)、管理されるサーバープロセス、といった3つ以上の java プロセスが起動することになります。ほとんどの場合が、管理されるサーバーのGCログが取得対象となるので、host.xml
に java オプションを設定すべきです。詳細は、How to enable Garbage Collection (GC) logging in EAP 6 をご覧ください。
Tomcat
-
EWS ZIP ディストリビューション
- 上で指定したように、お使いの JDK によって異なる JAVA_OPTS を startup.sh (Windows では bat) に追加する必要があります。
- gc.log ファイルへのフルパスを指定しない場合は、bin/startup スクリプトを実行するディレクトリに保存されます。
-
yum でインストールした Tomcat ディストリビューション
- 上で指定したように、お使いの JDK によって異なる JAVA_OPTS を次のいずれかに追加する必要があります。
- /etc/tomcat5/tomcat5.conf
- /etc/tomcat6/tomcat6.conf
- gc.log ファイルのフルパスを指定しない場合は /usr/share/tomcat/ に保存されます。
- 上で指定したように、お使いの JDK によって異なる JAVA_OPTS を次のいずれかに追加する必要があります。
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments