がわかりやすく伝えるためのクラスaクラスローダがロード?
-
07-07-2019 - |
質問
うことにより何らかの対策ユニット検査のための古い枠組みる試みを行っていますの模擬のデータベース。残念ながら当社の枠組みは少し古いものとな使用例はありませんからの最大の関心事です。私は少し心配しようと模擬のデータベース層というのは、JVM負荷の膨大な数の授業のないものを使用すること。
思クラスローダーするものであるとは問題にならないはずである。があるので、ピークを取ることであるすべてのクラスは特定のクラスローダがロードを証明するようにフード?
解決
使用することに注意してください
java -verbose
大量の出力が生成されます。出力をファイルに記録してから、grepを使用します。 「ティー」フィルターがある場合、これを試すことができます:
java -verbose | tee classloader.log
grep class classloader.log
他のヒント
独自のクラスローダーを作成し、それを使用して単体テスト中にロードできます。独自のカスタムクラスローダーに、実行されている内容を印刷してもらいます。
または、どのクラスがロードされているかだけを知りたい場合は、次のようにします:
java -verbose:class
わかりません。しかし、それができると思う方法が1つあります。たぶん、とんでもないです。アスペクトを試して、loadclassのポイントカットを配置できます。 また、jvm引数 -verbose が役立つかもしれません。
別の方法として、前述の特定のクラスローダーに対して、このコードスニペットを使用できます。必要に応じて、obj変数の値を変更します。
Object obj = this;
ClassLoader classLoader = obj.getClass().getClassLoader();
File file = new File("classloderClasses.txt");
if (file.exists()) {
file.delete();
}
if (classLoader != null) {
try {
Class clClass = classLoader.getClass();
while (clClass != ClassLoader.class) {
clClass = clClass.getSuperclass();
}
java.lang.reflect.Field classesField = clClass.getDeclaredField("classes");
classesField.setAccessible(true);
Vector classes = (Vector) classesField.get(classLoader);
FileOutputStream fos = new FileOutputStream("classloderClasses.txt", true);
fos.write(("******************** " + classLoader.toString() + " ******************** " + "\n").getBytes());
fos.write(Arrays.toString(classes.toArray()).getBytes());
fos.close();
} catch (Exception exception) {
exception.printStackTrace();
// TODO
}
}
ご利用の -Xlog
オプション設定をロギングのJava仮想マシン(JVM)統一のロギングの枠組みしかでき結果のテキストファイル
概要
-Xlog[:[what][:[output][:[decorators][:output-options [,...]]]]]
に統一ログ書式
-verbose:class
equals-Xlog:class+load=info
例えば、
java -Xlog:class+load=info:classloaded.txt
所属していません StackOverflow