2016-12-08 7 views
0

Недавно я сделал очень много изменений кода (из-за обновления сторонней библиотеки) в моем проекте java. В результате моя задача компиляции муравьев вышла из космоса (пустое пространство - старое поколение).Как найти утечку памяти в javac-задаче

Раньше я использовал 1G Xmx, теперь я должен использовать 2G для успешной компиляции. Я профилировал процесс джавака, но я не очень понимаю. Я включил многословный вывод, и я обнаружил, что он уходит из памяти при загрузке классов.

Есть ли способ найти, есть ли утечка памяти в программе 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/привязка/аннотаций/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) 
+0

Для этой цели есть профилировщики памяти Java, такие как JProfiler, YourKit Profiler. Но если вы обнаружите утечку памяти, что вы хотите сделать? – Codo

+1

(1) вероятность обнаружения утечки памяти в 'javac' исчезающе мала; он используется десятками тысяч людей каждый день. (2) без дополнительной информации (например, выполняемой вами задачи Ant и вывода из вашего сценария), никто не может помочь вам найти вашу проблему * real *. – kdgregory

+0

@kdgregory - Я просто запускаю задачу javac ant с исходным каталогом, в котором есть мои классы java. –

ответ

1

Скорее всего, вашему javac просто нужно больше памяти, чем по умолчанию.

Чем сложнее код, тем больше памяти он использует. Это вряд ли будет ошибкой или потому, что вы используете неправильный JAR.

Я бы удостоверился, что вы используете последнее обновление в случае, если проблема была исправлена, но это вряд ли изменит ситуацию.

+0

Никогда не обнаружил причину утечки памяти в задаче компиляции. просто уменьшилось использование, переключив GC из ParallelGC в G1 по умолчанию, и это снизило использование памяти примерно на 40 процентов. Принимая этот ответ и закрывая этот вопрос. Спасибо @Peter Lawrey –

 Смежные вопросы

  • Нет связанных вопросов^_^