我创建了一个Java FX应用程序,以使用procyon反编译器反编译项目中的数百个类文件。随着越来越多的文件被处理,该应用程序的内存使用量在几分钟内达到1GB。我想这与处理字符串和在进程中创建的对象没有被垃圾收集有关吗?
这里是重现此问题的示例代码。
File file1 = new File("file1.class");
File file2 = new File("file2.class");
ExecutorService pool = Executors.newFixedThreadPool(4);
DecompileUtils dcUtils = new DecompileUtils();
for(int i=0;i<500;i++){
Callable<Integer> task = () -> {
sourceCode1 = dcUtils.decompile(file1.getAbsolutePath());
sourceCode2 = dcUtils.decompile(file2.getAbsolutePath());
//do something with the result
return 1;
};
pool.submit(task);
包含用于反编译文件的方法的类:
public class DecompileUtils {
public String decompile(String source) throws IOException{
final DecompilerSettings settings = DecompilerSettings.javaDefaults();
PlainTextOutput pText = new PlainTextOutput();
Decompiler.decompile(source, pText, settings);
return pText.toString();
}
}
编辑:当我浏览procyon源代码时,我注意到创建类 AstBuilder 的对象时,内存使用量突然增加。即当调用 buildAst 方法时,该方法位于 JavaLanguage.class
中AstBuilder astBuilder = buildAst(type, options);