web-dev-qa-db-ja.com

ローリングガベージコレクターのログインjava

Sun JVMでガベージコレクターのログをローリングすることは可能ですか?

現在、私は以下を使用してログを生成します:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log 

ただし、fifoキューとrotatelogsを使用して手動でローテーションし、毎日新しいログを作成する必要があります。これに対するより良い解決策があることを願っています。

たぶん、このログエントリに内側からアクセスする方法がありますJavaので、log4jにリダイレクトできますか?

編集:FIFOキューを使用したソリューションは十分ではありません。このキューから読み込むプロセス(例えばrotatelogs)がそれを遅くするために読み込むと、jvm全体が遅くなります(明らかにSun/Oracleはgcロギングを同期的に行います)

42

GCログローテーションの組み込みサポートがHotSpot JVMに追加されました。 RFE 694192 で説明されており、以下で利用可能です。

有効化および構成に使用できる3つの新しいJVMフラグがあります。

  • _-XX:+UseGCLogFileRotation_
    _-Xloggc:<filename>_とともに使用する必要があります。
  • _-XX:NumberOfGCLogFiles=<number of files>_
    > = 1である必要があり、デフォルトは1です。
  • -XX:GCLogFileSize=<number>M (or K)
    defaultは512Kに設定されます。
84
Johan Kaving

Javaバージョンをアップグレードしてgcログのローテーションに新しいフラグを使用できない場合、アプリケーションが起動するたびに異なるgcファイルを指定できます。

Java_OPTS="-Xms1024m -Xmx1024m -XX:MaxPermSize=256m -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/path/to/log/dir/gc.log-"`date +%Y-%m-%d-%H-%M`

通常、起動時またはシャットダウン時にsetenvが参照されると、別のログファイルが参照されます。 UNIXでは、これをログの「回転」方法として使用できます。

6
Underverse

この新しいオプションを試しましたか?

私はjdk7u7、jdk7u6、jdk6u35を次のように試しました:

Java -Xloggc:gc.log -XX:+PrintGCDetails -XX:+UseGCLogRotation -XX:NumberOfGClogFiles=3 -XX:GCLogFileSize=10M

しかし、すべてのバージョンでこのエラーが表示されます:

Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

7u2のバグ修正#6941923はここで参照されます: http://www.Oracle.com/technetwork/Java/javase/2col/7u2bugfixes-1394661.html

3
Blazej

興味深いアプローチは、gc.logを名前付きパイプにリダイレクトすることです-Xloggc:/my/named/pipeGCログを名前付きパイプに書き込む方法

次に、アプリケーション自体からそのパイプを読み取ります: JavaからWindows名前付きパイプを開く方法?

そして、コードから任意の(非同期ローリングなど)ログバックロガーにログを記録します。

Windowsマシンで試してみました。残念ながら、LinuxよりもWindowsでセットアップする方が面倒です。

Windowsでは、基本的に追加の Powershellスクリプト (専用のアプリケーションにすることもできます)を使用して機能します。この サンプルプロジェクト には、SLF4Jを介したLogbackへのGCログリダイレクトのテストにすぐに使用できるデモアプリケーションも含まれています。

1

私はアプリケーションで新しいスレッドを生成し、 jcmd log-rotateコマンドを(cron式に基づいて)定期的に送信することで、この問題を解決しました。

Oracleの Attach API を使用するため、これは型破りなアプローチです。ただし、このアプローチはGCログを1時間ごとにローテーションするユースケースに役立ちました。

0
ajay

-XX:+ UseGCLogFileRotationを使用すると、solarisおよびJDKバージョン1.7.0_80-1.7.0_97および1.8.0_20-1.8.0_77で深刻な長いセーフポイントの問題が発生します

0
user9429838