如何在 javac 任务中查找内存泄漏
How to find a memory leak in javac task
我最近在我的 java 项目中进行了大量代码更改(由于第 3 方库升级)。
这导致我的 ant 编译任务内存不足(堆 space - 老一代)。
我之前用了1G的Xmx,现在编译成功要用2G了。
我已经分析了 javac 过程,但我没有深入了解。
我启用了详细输出,但我发现它在加载 classes.
时内存不足
有没有办法发现 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)
很可能您的 javac
只需要比默认内存更多的内存。
代码越复杂,使用的内存就越多。这不太可能是错误或因为您使用了错误的 JAR。
我会确保您使用的是最新更新,以防万一这个问题已经得到解决,但这不太可能产生影响。
我最近在我的 java 项目中进行了大量代码更改(由于第 3 方库升级)。 这导致我的 ant 编译任务内存不足(堆 space - 老一代)。
我之前用了1G的Xmx,现在编译成功要用2G了。 我已经分析了 javac 过程,但我没有深入了解。 我启用了详细输出,但我发现它在加载 classes.
时内存不足有没有办法发现 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)
很可能您的 javac
只需要比默认内存更多的内存。
代码越复杂,使用的内存就越多。这不太可能是错误或因为您使用了错误的 JAR。
我会确保您使用的是最新更新,以防万一这个问题已经得到解决,但这不太可能产生影响。