web-dev-qa-db-ja.com

Maven Out of Memoryビルドの失敗

今日、私の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コンパイルを正常に実行していました。

今日の時点で、ヒープをGBに増やしました。また、コードのマイナーラインを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>
77
Kevin Meredith

どのような「Web」モジュールについて話しているのですか?それは単純な戦争であり、包装型の戦争がありますか?

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>

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

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

私に思いついた別のアイデア(ばかげたアイデアかもしれません)、マシン内に十分なRAMがありますか?メモリサイズの定義は素晴らしいですが、ホストのサイズが4GBしかなく、OS、Java、MS-で既に使用されているため、Javaが定義されたメモリを使用できないという問題がある場合オフィス...

114
vach

一般的な MAVEN_OPTS 環境変数ではなく、別のオプションについて言及するために遅く答えると、必要なJVMオプションをMavenビルドに渡します。

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よりも脆弱ではないことです(設定を忘れる)。
さらに、マルチモジュールプロジェクトの場合、オプションはすべてのモジュールに適用されます。

27
A_Di-Matteo

Lowend 512Mb ram VPSと良好なCPUを使用して「クリーンインストール」をコンパイルしようとすると、同じ問題が発生しました。 OutOfMemoryとkillされたスクリプトを繰り返し実行します。

export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"を使用して作業しました。

Mavenが初めて必要になるため、まだ他のコンパイルエラーが発生していますが、OutOfMemoryの問題はなくなりました。

12
erm3nda

オプションを追加

-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>
10
Ilya

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

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

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

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

3
Christofer Dutz

Druid.ioのコンパイル時に同じ問題が発生し、MaxDirectMemorySizeの増加が最終的に機能しました。

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
2
hahakubile
_Java_OPTIONS="-Xmx3G" mvn clean install
1
DeviceManager

私の場合、これは以下の設定で動作します

<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を使用してみてください

1

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

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
0
ÖMER TAŞCI

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

0
colinbes

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

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

0
zhrist

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

0
user2046211