首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDK1.7 ClassLoader内存泄漏

JDK1.7 ClassLoader内存泄漏
EN

Stack Overflow用户
提问于 2012-12-19 21:42:44
回答 1查看 1.3K关注 0票数 12

我有子优先的UrlClassLoader来动态加载jar文件。然后,我执行一个反射来调用加载的jar文件中的一个方法。一旦完成,我更喜欢卸载类加载器。然后,我尝试执行一些压力测试代码,以确保我的代码能够顺利运行。基本上,我尝试做的是在循环语句中加载和卸载jar。下面是我的代码:

代码语言:javascript
复制
    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错误。不幸的是,它以不一致的方式发生。

EN

回答 1

Stack Overflow用户

发布于 2012-12-21 17:11:59

确认泄漏来源的最简单方法是使用探查器监视内存使用情况。试试JProfiler或VisualVM。它将使您能够精确定位泄漏的确切位置,并为您提供是否以及如何修复它的线索。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13953714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档