我试图在我的程序中添加一个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)