Class.forName()在JUnit中返回一个Class需要很长时间

时间:2017-08-28 11:49:36

标签: java reflection junit classloader

@Test
public void test() {
  ClassLoader classLoader = getClass().getClassLoader();
  ImmutableSet<ClassInfo> classInfoSet = ClassPath.from(classLoader)
            .getTopLevelClassesRecursive("com.example");
  for (ClassInfo classInfo : classInfoSet) {
    Class<?> clazz = classInfo.load();
    doSomething();
  }
}

我正在尝试处理20,00个类来检查注释用法是否正确。问题是classInfo.load()为特定的类花费了太多时间(约占所有类的20%)。

我通过以下代码替换了此方法以进行调试,并确认Class.forName()对于特定类需要花费几分钟。

String className = classInfo.getName();
Class<?> clazz = Class.forName(className);

我已多次运行此程序,并且它总是在相同的类中减速并在其他类中加速。我尝试用20个类运行测试更小的包,但速度没有提高。那些缓慢的类具有正常的代码量,并且无法找到问题。

我认为这是一个内存问题,并将下面的设置添加到VM参数中,但没有任何改变。

-XX:MaxPermSize=2048M
-XX:-UseGCOverheadLimit

我能解决这个问题吗?

0 个答案:

没有答案