小编典典

Maven 构建中的“java.lang.OutOfMemoryError:PermGen 空间”

all

我在构建 Maven 项目时遇到了这个错误,我增加了 MAVEN_OPTS 但都是一样的,我发现了一些类似的帖子,但它们指的是别的东西。我该如何解决?

The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: PermGen space
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at org.codehaus.plexus.compiler.javac.IsolatedClassLoader.loadClass(IsolatedClassLoader.java:56)
        at com.sun.tools.javac.comp.Annotate.<init>(Annotate.java:52)
        at com.sun.tools.javac.comp.Annotate.instance(Annotate.java:36)
        at com.sun.tools.javac.jvm.ClassReader.<init>(ClassReader.java:215)
        at com.sun.tools.javac.jvm.ClassReader.instance(ClassReader.java:168)
        at com.sun.tools.javac.main.JavaCompiler.<init>(JavaCompiler.java:293)
        at com.sun.tools.javac.main.JavaCompiler.instance(JavaCompiler.java:72)
        at com.sun.tools.javac.main.Main.compile(Main.java:340)
        at com.sun.tools.javac.main.Main.compile(Main.java:279)
        at com.sun.tools.javac.main.Main.compile(Main.java:270)
        at com.sun.tools.javac.Main.compile(Main.java:87)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.plexus.compiler.javac.JavacCompiler.compileInProcess(JavacCompiler.java:420)
        at org.codehaus.plexus.compiler.javac.JavacCompiler.compile(JavacCompiler.java:141)
        at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:493)
        at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:114)
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535)

我并不担心如何 在 Maven 生态系统中修复它


阅读 76

收藏
2022-07-31

共1个答案

小编典典

当你说你增加MAVEN_OPTS了,你增加了什么值?您是否增加了MaxPermSize,例如:

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

(或在 Windows 上:)

set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=128m

您还可以在每个 maven 项目中分别指定这些 JVM 选项。

回答晚了要提到另一个选项而不是通用MAVEN_OPTS环境变量来传递给 Maven 构建所需的 JVM 选项。

从 Maven 3.3.1开始,您可以将.mvn文件夹作为相关项目的一部分,并将jvm.config文件作为此类选项的理想位置。

两个新的可选配置文件.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文件中:

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

这种方法的主要优点是配置与相关项目隔离并应用于整个构建,并且比MAVEN_OPTS其他开发同一项目的开发人员更脆弱(忘记设置它)。
此外,如果是多模块项目,这些选项将应用于所有模块。

2022-07-31