Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

ガベージコレクションのログ記録を有効にする方法

Solution Verified - Updated -

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.batrun.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/ に保存されます。

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.