web-dev-qa-db-ja.com

Maven jvmArgを使用して「GCオーバーヘッド制限を超えました」を解決するにはどうすればよいですか?

クラスを実行すると、次の例外があります。

スレッド「メイン」の例外Java.lang.OutOfMemoryError:GCオーバーヘッド制限を超えました

クラスパッケージのmaven pom.xml内からjvmArgヒープサイズを増やしてみました。

http://maven.Apache.org/xsd/maven-4.0.0.xsd "> 4.0.0

<parent>
    (...)
</parent>


<artifactId>(...)</artifactId>
<name>(...)</name>

<properties>
    <javaOpts.Xmx>4g</javaOpts.Xmx> <!-- default that can be adjusted on the command line with -DjavaOpts.Xmx=... -->
    <(...).basedir>${project.basedir}/..</(...).basedir>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <configuration>
                <launchers>
                    <launcher>
                        <id>MyClassName</id>
                        <mainClass>(...)</mainClass>
                        <jvmArgs>
                            <jvmArg>-Xmx${javaOpts.Xmx}</jvmArg>
                        (...) 

私は最後の引用された行を多くの値で試しました:

  • <jvmArg>-Xmx512m{javaOpts.Xmx}</jvmArg>
  • <jvmArg>-Xmx4096M{javaOpts.Xmx}</jvmArg>
  • ...
  • <jvmArg>-Xmx10000000000M{javaOpts.Xmx}</jvmArg>

しかし、それらすべてについて同じエラーがあります。

誰でも私を助けることができますか?観察:IntelliJ IDEAから実行しています。

Java 7

Mavenの問題ではなく、VMにより多くのメモリを割り当てる必要があります。 環境変数でこれを行うと、Mavenランチャーはロード時にこれらの設定を自動的に選択し、それらを使用して基礎となるJava VMを構成します。

簡単な方法は次のとおりです。

export MAVEN_OPTS="-Xmx1024M -Xss128M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled"

ウィンドウズ:

set MAVEN_OPTS=-Xmx1024M -Xss128M -XX:MaxPermSize=1024M -XX:+CMSClassUnloadingEnabled

(二重引用符なし)

Java 8

Java 8は永続的な世代をメタスペースに置き換え、新しい設定は次のようになります。

export MAVEN_OPTS="-Xmx1024M -Xss128M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024M -XX:+CMSClassUnloadingEnabled"

42
flavian

私は同じような問題を抱えていました:私のプロジェクトワークスペースは250以上のMavenモジュールで構成されており、IDEAでpom.xmlを開くと、<project>および<parent>タグに赤の下線が引かれ、このエラーが表示されました壊れたタグの上にマウスを移動すると:

Java.lang.OutOfMemoryError:GCオーバーヘッド制限を超えました

私の解決策

  • >Settings >Build, Execution, Deployment >Build Tools >Maven >Importingに高い値を設定します-例-Xmx1gand
  • >Settings >Build, Execution, Deployment >Build Tools >Maven(Mavenホームディレクトリ)の下のmaven実装を(Bundled) Maven 3からローカルのmavenインストール(IDEAにバンドルされているものではない)に変更します。 to /opt/maven/Apache-maven-3.3.9Maven Settings Screenshot

以前にバンドルされたMavenで問題が発生したため、バンドルされたMavenを信頼していません。

6
Alexander

上記の一番上の答えにパラレルガベージコレクションを追加するのがおそらく最良の選択肢です。

-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC

場合によっては、GC制限を無効にすることができます。

-XX:-UseGCOverheadLimit
3
Nami

非常に遅い応答で申し訳ありませんが、私の答えは他の人にも役立つと思います。

scala-maven-pluginはMAVEN_OPTSでは動作しません。メモリを増やす唯一の方法は、プラグイン構成でjvmArgsを使用することです。ただし、jvmArgsはランチャーセクションではなく、次のように構成セクションに配置する必要があります。

<configuration>
    <jvmArgs>
        <jvmArg>-Xmx1024m</jvmArg>
        <jvmArg>-Xms256m</jvmArg>
    </jvmArgs>
</configuration>

これは私のために動作します。

2
sap1ens

JvmArgsをpom.xmlの maven-scala-plugin 構成に追加しています。

IntelliJ IDEAから実行しているとはどういう意味ですか?あなたはそれをどのくらい正確にやっていますか?ビルド/実行によって、Mavenを経由することはまったくありません!それから、pom.xmlのmaven-scala-pluginランチャーを変更することは基本的に役に立ちません。 IntelliJの実行構成を変更するには、 this answer を参照してください。

本当にMavenから実行する場合は、pom.xmlにjvmArg paramsを追加した後、プラグインを実行する必要があります。

mvm scala:run -Dlauncher=MyClassName

注:MyClassNameを配置する場所は、実際にはクラスではなくランチャーの名前です。多くのプロジェクトでは、人々はランチャーに適切な名前を付けます。これにより、クラスのローカル名と一致することがよくあります。ただし、必要に応じてMyLauncherと呼ぶこともできます。

Maven-scala-pluginのドキュメントを読むと役立つかもしれません。

0
Pablo Mendes