2016-12-08 3 views
0

私は最近、Javaプロジェクトで(サードパーティライブラリのアップグレードのために)コードを変更しました。 これは、私のant compilationタスクがメモリから外れることにつながりました(ヒープスペース - 古い世代)。javacのタスクでメモリリークを見つける方法

私は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の\のJDK \ 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

JProfiler、YourKit Profilerなど、この目的のためのJavaメモリプロファイラがあります。しかし、メモリリークが見つかった場合、何をしたいのですか? – Codo

+1

(1) 'javac'でメモリリークを見つけられる可能性はあまりありません。それは毎日何万人もの人々によって使用されています。 (あなたが実行しているAntタスクやスクリプトからの出力など)詳細な情報がなくても、誰かがあなたの*本当の*問題を見つけるのを手助けすることは不可能です。 – kdgregory

+0

@kdgregory - 私はちょうど私のJavaクラスを持つソースディレクトリを持つjavac antタスクを実行しています。 –

答えて

1

ほとんどの場合、javacはデフォルトより多くのメモリが必要です。

コードが複雑になればなるほど、使用するメモリは増えます。これはバグではなく、間違ったJARを使用しているためです。

問題が修正されている場合に備えて最新のアップデートを使用していることを確認しますが、これは違いはありません。

+0

コンパイルタスクでメモリリークの理由が見つかりませんでした。 GCをデフォルトのParallelGCからG1に切り替えるだけで使用量を減らし、メモリ使用量を約40%削減しました。この答えを受け入れ、この質問を閉じる。ありがとう@ピーターローリー –

関連する問題