Sun JVMでガベージコレクターのログをローリングすることは可能ですか?
現在、私は以下を使用してログを生成します:
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log
ただし、fifoキューとrotatelogsを使用して手動でローテーションし、毎日新しいログを作成する必要があります。これに対するより良い解決策があることを願っています。
たぶん、このログエントリに内側からアクセスする方法がありますJavaので、log4jにリダイレクトできますか?
編集:FIFOキューを使用したソリューションは十分ではありません。このキューから読み込むプロセス(例えばrotatelogs)がそれを遅くするために読み込むと、jvm全体が遅くなります(明らかにSun/Oracleはgcロギングを同期的に行います)
GCログローテーションの組み込みサポートがHotSpot JVMに追加されました。 RFE 694192 で説明されており、以下で利用可能です。
有効化および構成に使用できる3つの新しいJVMフラグがあります。
-XX:+UseGCLogFileRotation
_-Xloggc:<filename>
_とともに使用する必要があります。-XX:NumberOfGCLogFiles=<number of files>
_-XX:GCLogFileSize=<number>M (or K)
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では、これをログの「回転」方法として使用できます。
この新しいオプションを試しましたか?
私は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
興味深いアプローチは、gc.logを名前付きパイプにリダイレクトすることです-Xloggc:/my/named/pipe
GCログを名前付きパイプに書き込む方法
次に、アプリケーション自体からそのパイプを読み取ります: JavaからWindows名前付きパイプを開く方法?
そして、コードから任意の(非同期ローリングなど)ログバックロガーにログを記録します。
Windowsマシンで試してみました。残念ながら、LinuxよりもWindowsでセットアップする方が面倒です。
Windowsでは、基本的に追加の Powershellスクリプト (専用のアプリケーションにすることもできます)を使用して機能します。この サンプルプロジェクト には、SLF4Jを介したLogbackへのGCログリダイレクトのテストにすぐに使用できるデモアプリケーションも含まれています。
私はアプリケーションで新しいスレッドを生成し、 jcmd log-rotateコマンドを(cron式に基づいて)定期的に送信することで、この問題を解決しました。
Oracleの Attach API を使用するため、これは型破りなアプローチです。ただし、このアプローチはGCログを1時間ごとにローテーションするユースケースに役立ちました。
-XX:+ UseGCLogFileRotationを使用すると、solarisおよびJDKバージョン1.7.0_80-1.7.0_97および1.8.0_20-1.8.0_77で深刻な長いセーフポイントの問題が発生します