我正在尝试为旧框架实现一些单元测试。我试图模拟出数据库层。不幸的是,我们的框架有点陈旧,并没有完全采用最佳实践,因此没有明确的关注点分离。我有点担心试图模拟数据库层可能会使JVM加载大量甚至无法使用的类。
我不太了解类加载器,所以这可能不是问题。有没有办法在特定的ClassLoader加载的所有类中达到峰值,以证明引擎盖下发生了什么?
答案 0 :(得分:38)
您可以创建自己的类加载器并在单元测试期间使用它加载。让自己的自定义类加载器打印出它正在做的事情。
或者,如果您只是想知道加载了哪些类,请执行:
java -verbose:class
答案 1 :(得分:15)
警告使用
java -verbose
会产生大量的输出。将输出记录到文件,然后使用grep。如果你有'tee'过滤器,你可以试试这个:
java -verbose | tee classloader.log
grep class classloader.log
答案 2 :(得分:3)
我不确定。但有一种方法我认为可以做到。虽然这可能太荒谬了。您可以尝试方面并为loadclass设置切入点。 也许jvm参数 -verbose 可能有帮助。
答案 3 :(得分:1)
作为替代方法,对于您提到的特定类加载器,您可以使用此代码段。如果需要,只需更改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
}
}
答案 4 :(得分:0)
您使用-Xlog
选项来配置或启用Java虚拟机(JVM)统一日志记录框架的日志记录。好处是您可以将结果写入文本文件
简介
-Xlog[:[what][:[output][:[decorators][:output-options [,...]]]]]
在统一日志记录语法中,
-verbose:class
等于-Xlog:class+load=info
例如
java -Xlog:class+load=info:classloaded.txt