Javaのクラス管理の特長として、委譲モデルと呼ばれる複数のクラスローダを組み合わせた機構や、jar/warファイルなどのパッケージ機構があります。
この機構により、Javaプロセス内でのアプリケーションテナント化やクラスファイル資産管理ができる一方で、以下のトラブルが発生することがあります。
参照できるはずのクラスが、特定のアプリケーションから参照できない
特定のアプリケーションから参照できてはいけないクラスが参照できる
同じ名前の複数バージョンが存在するが、適切なバージョンが参照できない
このようなクラスローダやクラス管理のトラブルを調査するためには、クラスがどこ(jar/warファイルなど)から、どのクラスローダでロードされたかを確認する必要があります。
クラスのロード情報調査
クラスロードの発生状況を調査するためには、““ClassLoadTrace”イベント”を使用します。
JMCで[アウトライン]タブの[イベント・ブラウザ]を選択します。
表示された[イベント・タイプ・ツリー]から、[Fujitsu Extended Event]の[Class Load Trace]を選択します。
“ClassLoadTrace”イベントの一覧が表示されます。
クラスがどこからロードされたかは[Loaded Class Source]に表示され、クラスをロードしたクラスローダは[定義クラス・ローダー]に表示されます。
トラブルが疑われるクラスを、[Loaded Class]から探します。そのクラスの[Loaded Class Source]や[定義クラス・ローダー]を参照して、正しくクラスがロードされたかを調査します。
例えば上記では、“F:\work\build\sample.jar”から“com.fujitsu.jdk.SampleClass”というクラスがシステムクラスローダによってロードされていることがわかります。
“stackTrace”プロパティを“true”に指定している場合、[スタック・トレース]にイベント発生時のスタックトレースが表示されますので、調査対象のクラスをロードしているアプリケーションのコードがわかります。
“ClassLoadTrace”イベントは、本製品で提供するOpenJDKが実装している拡張機能であるため、“default.jfc”および“profile.jfc”のイベント設定ファイルでは使用できません。
また、“extend.jfc”に以下のように設定されており、デフォルトで有効になっています。スタックトレースはデフォルトでは記録されない設定になっています。設定を変更する場合は、“extend.jfc”の設定を修正した別のイベント設定ファイルを作成し、使用してください。
<event name="com.fujitsu.jdk.ClassLoadTrace"> <setting name="enabled" control="class-loading-enabled">true</setting> <setting name="stackTrace">false</setting> <setting name="threshold">0 ms</setting> </event>
イベント設定ファイルの設定方法は、“イベント設定ファイル”を参照してください。
“enabled”プロパティ
true:イベントを有効にします。
false:イベントを無効にします。
“stackTrace”プロパティ
true:クラスをロードしたときのスタックトレースをイベントに出力します。
false:クラスをロードしたときのスタックトレースをイベントに出力しません。
“threshold”プロパティ
クラスのロードにかかる時間をしきい値として指定します。このプロパティに指定した値以上の時間がかかったクラスのロードだけイベントに記録されます。
“<整数> <単位>”で指定します。
<整数>前後の空白は無視します。
<整数>に0を指定した場合、ロード時間に関わらず全クラスロードが記録の対象になります。
単位として次の文字を指定します。
・ナノ秒を指定する場合: “ns”
<整数>の指定範囲:0以上、9223372036854775807以下
・マイクロ秒を指定する場合: “us”
<整数>の指定範囲:0以上、9223372036854775以下
・ミリ秒を指定する場合: “ms”
<整数>の指定範囲:0以上、9223372036854以下
・秒を指定する場合: “s”
<整数>の指定範囲:0以上、9223372036以下
・分を指定する場合: “m”
<整数>の指定範囲:0以上、153722867以下
・時を指定する場合: “h”
<整数>の指定範囲:0以上、2562047以下
・日を指定する場合: “d”
<整数>の指定範囲:0以上、106751以下
ポイント
多数のクラスロードが想定され、ロードに時間がかかっているクラスロードだけを表示したい場合は、“threshold”プロパティを修正してください。
クラスがロードされるまでの経緯を調べたい場合は、“stackTrace”プロパティを“true”に指定してください。