今日、私の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>
どのような「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が定義されたメモリを使用できないという問題がある場合オフィス...
一般的な 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
よりも脆弱ではないことです(設定を忘れる)。
さらに、マルチモジュールプロジェクトの場合、オプションはすべてのモジュールに適用されます。
Lowend 512Mb ram VPSと良好なCPUを使用して「クリーンインストール」をコンパイルしようとすると、同じ問題が発生しました。 OutOfMemoryとkillされたスクリプトを繰り返し実行します。
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"
を使用して作業しました。
Mavenが初めて必要になるため、まだ他のコンパイルエラーが発生していますが、OutOfMemoryの問題はなくなりました。
オプションを追加
-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>
どのタイプの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のメモリが割り当てられます。
Druid.ioのコンパイル時に同じ問題が発生し、MaxDirectMemorySizeの増加が最終的に機能しました。
export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"
_Java_OPTIONS="-Xmx3G" mvn clean install
私の場合、これは以下の設定で動作します
<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を使用してみてください
Unix/Linuxプラットフォームでプロジェクトをビルドするときに、Mavenオプションの構文を次のように設定します。二重qoutationではなく、単一qoutation記号に注意してください。
export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
.mvn/jvm.configを使用するとうまくいきましたが、プロジェクトにリンクできるという利点もあります。
これは、cygwinまたは他のLinuxエミュレーターを使用する場合(git bash)、Windows上の大きなプロジェクトで発生します。偶然にも、どちらも私のプロジェクトでは機能しません。これは大きなオープンソースプロジェクトです。 shスクリプトでは、いくつかのmvnコマンドが呼び出されます。メモリサイズは、Xmxで指定されたヒープサイズよりも大きくなり、ほとんどの場合、2番目のWindowsプロセスが開始されます。これにより、メモリ消費量がさらに高くなります。
この場合の解決策は、バッチファイルを使用してXmxサイズを縮小し、Maven操作が成功することです。興味があれば、詳細を明らかにすることができます。
誰かがすでに32ビットOSの問題に言及しています。私の場合、問題は32ビットJDKでコンパイルしていたことです。