Mavenのメモリ不足ビルドの失敗


88

今日の時点で、私のMavenコンパイルは失敗します。

[INFO] [ERROR] Unexpected
[INFO] java.lang.OutOfMemoryError: Java heap space
[INFO]  at java.util.Arrays.copyOfRange(Arrays.java:2694)
[INFO]  at java.lang.String.<init>(String.java:203)
[INFO]  at java.lang.String.substring(String.java:1877)

[エラー]メモリ不足。メモリの量を増やすには、起動時に-Xmxフラグを使用します(java -Xmx128M ...)

昨日の時点で、Mavenコンパイルを正常に実行できました。

今日の時点で、ヒープを3GBに増やしました。また、2〜3行のコードを変更しただけなので、この「メモリ不足」エラーがわかりません。

vagrant@dev:/vagrant/workspace$ echo $MAVEN_OPTS
-Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m

編集:失敗したモジュールのpom.xmlを変更して、投稿者のコメントを試しました。しかし、同じMavenビルドエラーが発生しました。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.5</source>
            <target>1.5</target>
            <fork>true</fork>
            <meminitial>1024m</meminitial>
            <maxmem>2024m</maxmem>
       </configuration>
    </plugin>

1
より多くのスタックトレースを提供できますか?文字列の初期化でメモリが不足する原因が何であるかを知りたいです。MAVEN_OPTSでヒープサイズを設定する方法のように聞こえますが、私の推測では、どこかに途方もなく大きな文字列があり、十分に割り当てられていない可能性があります-Xmx
エドワードサムソン

回答:


136

どのような「ウェブ」モジュールについて話しているのですか?単純な戦争で、パッケージングタイプの戦争がありますか?

GoogleのWebツールキット(GWT)を使用していない場合は、提供する必要はありません。 gwt.extraJvmArgs

コンパイルプロセスをフォークすることは、MAVEN_OPTS完全に無視する2番目のプロセスを開始し、分析をより困難にするため、最善のアイデアではない可能性があります。

したがって、MAVEN_OPTSを設定してXmxを増やしてみます

export MAVEN_OPTS="-Xmx3000m"

また、コンパイラを別のプロセスにフォークしないでください

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
   </configuration>
</plugin>

-XX:MaxPermSize=512mパーマサイズが問題の原因である場合、エラーが予想されるため、増やす必要はありません。java.lang.OutOfMemoryError: PermGen space

それでも問題が解決しない場合は、を追加してさらに分析するためのヒープダンプを作成できます-XX:+HeapDumpOnOutOfMemoryError。さらに、Java binディレクトリのjconsole.exeを使用して、コンパイルの実行中にjvmに接続し、jvmのヒープ内で何が起こっているかを確認できます。

私に思いついた別のアイデア(愚かなものかもしれません)、あなたはあなたのマシンの中に十分なRAMを持っていますか?メモリサイズを定義するのは良いことですが、ホストの容量が4GBしかない場合、OS、Java、MS-Officeですでに使用されているため、Javaが定義されたメモリを使用できないという問題が発生する可能性があります。


お返事をありがとうございます。フォークされたJVMを削除するというあなたの提案は、「maven-surefire-plugin」にも当てはまりますか?MAVEN_OPTSメモリを3000に増やすという提案を試みました。MavenコンパイラにはフォークされたJVMの設定がなかったため、そこで何も変更する必要はありませんでした。はい、私のゲストVMには4GBのRAMがあります。ホストマシンには8GBのRAMがあります。
ケビンメレディス

2
ちなみに、mvnビルドはあなたの提案で再び失敗しました。
ケビンメレディス

1
通常、プロセスフォークを実行しない限り、プロセスフォークを回避しようとします。システムに4GBしかない場合、OSは最大1GBを使用します。つまり、3GBの残りがあります。MavenがXms = 1GBで始まる場合、残りの空きメモリは2GBです。次に、コンパイラフォークはXms = 1GB ....で開始され、空きメモリが1GBに減少します。これで、フォークされたフェイルセーフプラグインプロセスであるPermGenメモリ128MBを差し引くことができます...ご覧のとおり、メモリは単純で空きではないため、Xmx設定をJVMで使用することはおそらく不可能です。JConsoleを使ってみましたか?およびHeapDumpOnOutOfMemoryError?
vach 2012

MAVEN_OPTSからXms1024mを削除しましたが、mvnビルドはまだ失敗しました。MAVEN_OPTSに「HeapDump ...」を追加しましたが、ダンプがどこに出力されるかわかりません。JConsoleを今調べています。
ケビンメレディス

ダンプはjvmsディレクトリ内のplcesです
vach

36

MAVEN_OPTSMavenに渡す共通の環境変数ではなく、さらに別のオプションについて言及するために遅れて回答し、必要なJVMオプションを構築します。

Mavenの以来3.3.1、あなたが持っている可能性が.mvn懸念プロジェクトの一環として、フォルダをjvm.configそのようなオプションに最適な場所としてファイル。

プロジェクトソースツリーのベースディレクトリにある2つの新しいオプションの構成ファイル.mvn/jvm.config.mvn/maven.config。存在する場合、これらのファイルはデフォルトのjvmおよびmavenオプションを提供します。これらのファイルはプロジェクトソースツリーの一部であるため、すべてのプロジェクトチェックアウトに存在し、プロジェクトがビルドされるたびに自動的に使用されます。

公式リリースノートの一部として

Mavenでは、プロジェクトごとにJVM構成を定義するのは簡単ではありません。環境変数MAVEN_OPTSとの使用法に基づく既存のメカニズム${user.home}/.mavenrcは、プロジェクトの一部ではないという欠点を持つ別のオプションです。

このリリース以降、${maven.projectBasedir}/.mvn/jvm.configファイルを介してJVM構成を定義できます。つまり、プロジェクトごとにビルドのオプションを定義できます。このファイルはプロジェクトの一部になり、プロジェクトと一緒にチェックインされます。したがってMAVEN_OPTS.mavenrcファイルはもう必要ありません。したがって、たとえば、次のJVMオプションを${maven.projectBasedir}/.mvn/jvm.configファイルに入れた場合:

-Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true

このアプローチの主な利点は、構成が関連するプロジェクトに分離され、ビルド全体にも適用さMAVEN_OPTSれ、同じプロジェクトで作業している他の開発者よりも脆弱ではないことです(設定を忘れています)。
さらに、マルチモジュールプロジェクトの場合、オプションはすべてのモジュールに適用されます。


2
JDK 8を使用している場合、MaxPermSizeは無視されることに注意してください。
GeraldScott19年

14

ローエンド512Mbram VPSと優れたCPUを使用して「クリーンインストール」をコンパイルしようとすると、同じ問題が発生しました。OutOfMemoryを実行し、スクリプトを繰り返し強制終了します。

私は使っexport MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"て働きました。

Mavenが初めて必要なため、他のコンパイルエラーが発生しますが、OutOfMemoryの問題は解消されました。


11

オプションを追加

-XX:MaxPermSize=512m

MAVEN_OPTSへ

maven-compiler-plugin オプション

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
      <fork>true</fork>
      <meminitial>1024m</meminitial>
      <maxmem>2024m</maxmem>
    </configuration>
  </plugin>

2
この投稿を行った後、実際にオプション-XX:MaxPermSize = 1024mを追加しました。しかし、それでもメモリ不足エラーが発生しました。別のSOの投稿では、フォークされたスレッドが使用するメモリを増やすために、maven-surefire-pluginのargLineにオプションを追加する必要があると述べています。<argLine> -Xms256m -Xmx1024m -XX:PermSize = 128m -XX:MaxPermSize = 512m </ argLine>に増やしました
Kevin Meredith

私はそれを言及する必要がありました...いいえ、Mavenビルドはまだ失敗しました。
ケビンメレディス

このすべてのプロパティを追加maven-compilier-pluginして増加し-XX:MaxPermSizeXmxあるべき=XX:MaxPermSize
イリヤ

また、オプション<fork> true </ true>をmaven-compilier-plugin
Ilya

私はそれを試しましたが(元の投稿を参照してください)、mvnビルドはまだ失敗しました。
ケビンメレディス

4

Druid.ioをコンパイルするときに同じ問題が発生し、MaxDirectMemorySizeを増やすことが最終的に機能しました。

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"

不思議なことに、MaxDirectMemorySizeは、表面上はデフォルトで制限されていません(つまり、制限を追加し、既存の制限を調整していません)。
Tomer Gabel 2017

4

私の場合、以下の構成が機能します

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
        <verbose>true</verbose>
        <fork>true</fork>
        <argLine>-XX:MaxPermSize=500M</argLine>
    </configuration>
</plugin>

-XX:MaxPermGenの代わりに-XX:MaxPermSizeを使用してみてください



3

どのタイプのOSを実行していますか?

2GBを超えるRAMを割り当てるには、少なくとも64ビットOSである必要があります。

次に、別の問題があります。OSに無制限のRAMが搭載されていても、2 GBの空きブロックが1つも使用できないように断片化されている場合でも、メモリ不足の例外が発生します。また、通常のヒープメモリは、VMプロセスが使用しているメモリの一部にすぎないことに注意してください。したがって、32ビットマシンでは、Xmxを2048MBに設定することはおそらく不可能です。

また、最小最大メモリを同じ値に設定することをお勧めします。この場合、VMがメモリを使い果たすとすぐに、最初から1GBが割り当てられ、VMは新しいブロックを割り当てます(その後、1.5GBの500MBブロック)が割り当てられ、ブロック1から新しいブロックにすべてのものがコピーされ、その後メモリが解放されます。再びメモリが不足した場合は、2 GBが割り当てられ、1.5 GBがコピーされ、一時的に3.5GBのメモリが割り当てられます。


1

Unix / Linuxプラットフォームでプロジェクトをビルドするときに、Mavenオプションの構文を次のように設定します。二重引用符ではなく、単一引用符の記号に注意してください。

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'

0

.mvn / jvm.configを使用すると、プロジェクトにリンクできるという追加の利点があります。


0

これは、cygwinまたは他のLinuxエミュレーター(git bash)が使用されている場合、Windows上の大きなプロジェクトで発生します。偶然にも、どちらも私のプロジェクトでは機能しません。これは大きなオープンソースプロジェクトです。shスクリプトでは、いくつかのmvnコマンドが呼び出されます。メモリサイズは、Xmxで指定されたヒープサイズよりも大きくなり、ほとんどの場合、2番目のWindowsプロセスが開始されます。これにより、メモリ消費量がさらに高くなります。

この場合の解決策は、バッチファイルと縮小されたXmxサイズを使用することです。そうすれば、maven操作は成功します。興味があれば、詳細を明らかにすることができます。


0

誰かがすでに32ビットOSの問題について言及しています。私の場合、問題は32ビットJDKでコンパイルしていたことでした。


0

環境変数「MAVEN_OPTS」のメモリサイズを増やすと、この問題の解決に役立ちます。私にとっては、-Xmx756Mから-Xmx1024Mに増やすことができました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.