【发布时间】:2016-12-08 12:52:37
【问题描述】:
我最近在我的 java 项目中进行了大量的代码更改(由于第 3 方库升级)。 这导致我的 ant 编译任务内存不足(堆空间 - 老一代)。
我之前用的是1G的Xmx,现在必须用2G才能编译成功。 我已经分析了 javac 过程,但我没有得到太多的见解。 我启用了详细输出,但我发现它在加载类时内存不足。
有没有办法查出javac程序是否存在内存泄漏?
javac] [loading ZipFileIndexFileObject[C:\Dev\jdks\jdk7\jre\lib\rt.jar(javax/xml/bind/annotation/XmlAnyElement.class)]]
javac] [loading ZipFileIndexFileObject[C:\Dev\jdks\jdk7\jre\lib\rt.jar(javax/xml/bind/annotation/XmlAttribute.class)]]
javac] [loading ZipFileIndexFileObject[C:\Dev\jdks\jdk7\jre\lib\rt.jar(javax/xml/bind/annotation/XmlSchemaType.class)]]
javac] [loading ZipFileIndexFileObject[C:\Dev\jdks\jdk7\jre\lib\rt.jar(javax/xml/bind/annotation/XmlElementDecl.class)]]
javac] [loading ZipFileIndexFileObject[C:\Dev\jdks\jdk7\jre\lib\rt.jar(javax/xml/bind/annotation/XmlSeeAlso.class)]]
javac] [加载 ZipFileIndexFileObject[C:\Dev\jdks\jdk7\jre\lib\rt.jar(javax/xml/bind/annotation/XmlElement.class)]]]
javac]
javac]
javac] The system is out of resources.
javac] Consult the following stack trace for details.
javac] java.lang.OutOfMemoryError: Java heap space
javac] at com.sun.tools.javac.code.Scope$ImportScope.makeEntry(Scope.java:515)
javac] at com.sun.tools.javac.code.Scope.enter(Scope.java:219)
javac] at com.sun.tools.javac.code.Scope.enter(Scope.java:201)
javac] at com.sun.tools.javac.code.Scope$StarImportScope.importAll(Scope.java:540)
javac] at com.sun.tools.javac.comp.MemberEnter.importAll(MemberEnter.java:147)
javac] at com.sun.tools.javac.comp.MemberEnter.visitTopLevel(MemberEnter.java:522)
javac] at com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:459)
javac] at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:401)
javac] at com.sun.tools.javac.comp.MemberEnter.complete(MemberEnter.java:876)
javac] at com.sun.tools.javac.code.Symbol.complete(Symbol.java:421)
javac] at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:821)
javac] at com.sun.tools.javac.comp.Enter.complete(Enter.java:491)
javac] at com.sun.tools.javac.comp.Enter.main(Enter.java:469)
javac] at com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:929)
javac] at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:824)
javac] at com.sun.tools.javac.main.Main.compile(Main.java:439)
【问题讨论】:
-
有用于此目的的 java 内存分析器,例如 JProfiler、YourKit Profiler。但是如果你发现内存泄漏,你想怎么办?
-
(1) 在
javac中发现内存泄漏的可能性微乎其微;每天有成千上万的人使用它。 (2) 如果没有更多信息(例如您正在执行的 Ant 任务和脚本的输出),任何人都无法帮助您找到真正的问题。 -
@kdgregory - 我正在运行一个 javac ant 任务,其源目录包含我的 java 类。
-
看起来您正在处理生成的 JAXB 文件。这些文件有多复杂?生成的文件可能会导致编译器出现问题,或者(正如其他人所说)它们太复杂以至于需要更多内存。
-
对于它的价值,“Scope 类是符号的容器,它提供对给定名称的符号的有效访问。” (来自JDK7 source)。这对我来说意味着正在编译的文件在可用内存的给定范围内有太多符号。而且由于它是一个 JAXB 文件,我怀疑底层架构中有太多潜在的元素/属性。这就是说:您要么需要修剪架构,要么需要增加编译器内存。
标签: java memory-leaks out-of-memory javac