【问题标题】:How to find a memory leak in javac task如何在 javac 任务中查找内存泄漏
【发布时间】: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


【解决方案1】:

很可能您的javac 只需要比默认设置更多的内存。

代码越复杂,它使用的内存就越多。这不太可能是错误或因为您使用了错误的 JAR。

我会确保您使用的是最新更新,以防问题已得到修复,但这不太可能产生影响。

【讨论】:

  • 在编译任务中找不到内存泄漏的原因。只是通过将 GC 从默认的 ParallelGC 切换到 G1 来减少使用量,并将内存使用量降低了大约 40%。接受这个答案并关闭这个问题。谢谢@Peter Lawrey
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 2014-03-26
  • 1970-01-01
相关资源
最近更新 更多