メソッドトレース機能の注意事項を説明します。
メソッドトレース機能は、製品添付のOpenJDKでのみ動作可能です。
メソッドトレース機能はJavaの提供するJVMTI機能とバイトコードの更新により実現しています。そのため、他のJVMTI機能の実装によるプロファイラやデバッガと同時に使用しないことをお勧めします。
メソッドトレース機能を使用する場合、実行性能が劣化します。したがって、本運用ではトレースを行わないことをお勧めします。
“traceFile”の指定は、デバッグ目的だけで使用し、アプリケーションを連続で実行する場合には使用しないでください。この指定ではファイルローテーションされず、常に1つのファイルにログが書き込まれるため、巨大なログファイルとなります。
ファイルローテーションするように指定した場合、1つのファイルサイズが、“traceFileSize”に指定した値よりも大きくなる場合があります。これは、“traceFileSize”に指定した値の境界で、1行に表されるべき情報が複数のファイルに分割されないようにしているためです。
文字列の出力は、常に、JavaプロセスのOSのロケールに従った標準のエンコーディングで行われます。Javaプロセス内で、別のエンコーディングを使用している場合に、文字化けする可能性もありえます。その場合は、“valueLevel=addHex”等で16進数表示するか、出力ファイルのコード変換などを適宜行ってください。
GlassFish Serverクラスターの場合、カレントディレクトリが移動します。そのため“traceFile”か“traceDirectory”を必ず指定してください。
ファイル出力中、出力先のディスク容量が不足した場合、それ以降はトレース出力されません。
トレースするメソッドが存在しない場合、“traceFile”、または“traceDirectory”に指定したファイルは作成されません。
動的にCLASSPATHを決定するプログラムをトレースする場合、制御ファイルに“classPath”の設定が必要です。“classPath”の設定がない場合、標準出力(または、使用方法記載のログファイル)に“java.lang.ClassNotFoundException: Exception while looking for class xxxxx: java.io.IOException: Couldn't find: xxxxx”(xxxxxはクラスファイル名)というエラーメッセージが表示されることがあります。その場合、トレース処理は行いますが、トレース対象の決定は、クラス名、インターフェース名、スーパークラス名のみで判断し、メソッド名、シグネチャの指定は無効となります。
サーブレットのメソッドトレースで、制御ファイルに“classPath”の設定がない場合、サーブレットがハングアップしたり、異常終了することがあります。
これは、サーブレットのログファイルへの出力とメソッドトレースのエラーメッセージの出力が競合を起こし、デッドロックを起こすためです。この場合、“classPath”を制御ファイルに指定してください。指定されている場合、正しく設定されているか確認をしてください。
メソッドトレース機能を利用した場合、標準出力(または、使用方法記載のログファイル)に"java.lang.ClassFormatError: LVTT entry for 'yyyy' in class file a does not match any LVT entry"(yyyyはプログラム中の変数名)というエラーメッセージが表示されることがあります。
その場合、トレース対象のJava VMオプションに-noverifyオプションまたは、-Xverify:noneオプションを指定してください。
ただし、この場合、クラスファイルの検証がされなくなりますので、このオプションの指定はメソッドトレース利用時のみに限定し、アプリケーションの実運用時には指定しないでください。
任意のディレクトリを作成してメソッドトレース機能の動作に必要なモジュールをコピーして使用することもできます。その場合、作成するディレクトリのパスは必ず“tools\fjtrace”(Windows(R)の場合)または“tools/fjtrace”(Solaris/Linuxの場合)で終わるものにしてください。また、環境変数もそれに合わせて設定してください。
メソッドトレース機能の動作に必要なモジュールは、“A.1.3 格納先”を参照してください。
メソッドトレース機能の格納先パスや制御ファイルの格納先パスに、以下の文字が含まれている場合、メソッドトレース機能は使用できません。これらの文字が含まれていないディレクトリを使用してください。
ダブルクオーテーション(")
半角スペース
全角文字
-Djava.library.pathを指定してJavaプロセスを起動した場合は、環境変数PATHやLD_LIBRARY_PATHだけでなく、-Djava.library.pathにも、メソッドトレース機能の格納先のフルパスを追加してください。