小编Dav*_*vid的帖子

在运行时使用JDK编译器时内存泄漏

我试图在我的程序中添加一个javaeditor来在运行时扩展程序.一切正常,除了广泛使用程序(我模拟1000-10000编译器执行).内存使用量上升和上升,看起来有内存泄漏.

在我的程序中,类被加载,构造函数被执行并且类被卸载(没有剩余的实例,并且当我将指针设置为null时,classLoader变得无效).我用JConsole分析了这个过程,当执行垃圾收集器时类会被卸载.

我在内存分析器中做了一个heapdum打开它,问题似乎是在java.net.FactoryURLClassLoader里面(在com.sun.tools.javac.util.List对象中).由于(com.sun.tools.javac)是JDK的一部分而不是JRE,而SystemToolClassLoader是FactoryURLClassLoader对象,我会在那里的某处找到泄漏.当我第一次执行编译器时,SystemToolClassLoader中加载的类的数量从1上升到521,但之后保持不变.

所以我不知道泄漏在哪里,有没有办法重置SystemToolClassLoader?我怎样才能更准确地找到泄漏点.

编辑:好的,我发现它也发生在一个非常简单的例子中.所以它似乎是编译的一部分,我不需要加载类或实例化它:

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;


public class Example {   

public static void main(String[] args)
{
    for (int i =0; i<10000;i++){
        try {
            System.out.println(i);
            compile();
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

public static void compile() throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException
{
    File source = new File( "src\\Example.java" ); // This File
    JavaCompiler compiler …
Run Code Online (Sandbox Code Playgroud)

java reflection classloader

8
推荐指数
2
解决办法
2035
查看次数

标签 统计

classloader ×1

java ×1

reflection ×1