94

今日の時点で、私の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>
4

14 に答える 14

145

どのような「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>

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

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

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

于 2012-09-22T12:56:51.780 に答える
40

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は、プロジェクトの一部ではないという欠点を持つ別のオプションです。

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

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

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

于 2016-03-14T21:50:25.640 に答える
16

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

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

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

于 2015-01-19T06:06:22.800 に答える
13

オプションを追加

-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>
于 2012-09-19T16:50:13.587 に答える
3

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

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

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

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

于 2012-09-28T14:46:15.537 に答える
2

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

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'
于 2018-07-19T06:18:09.110 に答える
0

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

于 2016-03-23T18:39:20.473 に答える