我有一个以孩子为先的UrlClassLoader来动态加载jar文件。然后我做一个反射来调用加载的jar文件中的方法。一旦完成,我宁愿卸载类加载器。然后我尝试做一些压力测试代码,以确保我的代码顺利运行。基本上,我尝试做的是在循环语句中加载和卸载jar。这是我的代码:
for (int i = 0; i < 1000; i++) {
//Just to show the progress
System.out.println("LOAD NUMBER : " + i);
ChildFirstURLClassLoader classLoader = null;
try {
File file = new File("C:\\library.jar");
String classToLoad = "com.test.MyClass";
URL jarUrl = new URL("file:" + file.getAbsolutePath());
classLoader = new ChildFirstURLClassLoader(new URL[] {jarUrl}, null);
Class<?> loadedClass = classLoader.loadClass(classToLoad);
Method method = loadedClass.getDeclaredMethod("execute",
new Class[] {});
ClassLoader currCl= Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
method.invoke(null);
Thread.currentThread().setContextClassLoader(currCl);
method = null;
loadedClass = null;
} finally {
if (classLoader != null) {
classLoader.close();
classLoader = null;
}
}
}
当我在JDK1.6下运行此代码而没有classLoader.close();
语句时,该代码运行完美。但是当我转向JDK1.7时,有时会出现java.lang.OutOfMemoryError: PermGen space
错误。不幸的是,它以不一致的方式发生。
答案 0 :(得分:2)
确认泄漏源自何处的最简单方法是使用分析器监视内存使用情况。试试JProfiler或VisualVM。它将使您能够精确定位泄漏的确切位置,并为您提供有关是否以及如何修复泄漏的线索。