Maven构建中的"java.lang.OutOfMemoryError: PermGen space"问题

185

我在构建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生态系统中进行修复


1
如果你在SO上搜索"PermGen space",会有很多类似的问题。 - Paul Tomblin
1
嗯,这是在部署到Tomcat时出现的问题,我还没有做得那么远,所以它与您看到的不同。我甚至不使用Tomcat,而是使用JBoss。错误发生在Maven构建期间。 - Gandalf StormCrow
6
@Paul Tomblin 我同意,但是它们都没有提到在构建项目时出现的错误。 - Gandalf StormCrow
2
@Gandalf - 这是我为Maven找到的建议:-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m - Andreas Dolk
请注意,如果您有多个模块,告诉maven-compiler-plugin进行分叉可能会更有益。 - Thorbjørn Ravn Andersen
显示剩余5条评论
7个回答

312
当您说您增加了MAVEN_OPTS时,您增加了哪些值?您是否像示例中一样增加了MaxPermSize
export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"

(或者在 Windows 上:)

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

您也可以在每个Maven项目中单独指定这些JVM选项


7
我能否在pom.xml文件中以某种方式设置该属性?我需要使我的构建过程在不同的环境中具备可移植性。 - Ondrej Bozek
5
他知道这件事,但这不是他所问的。 - Nicholas DiPiazza
19
给Mac/Linux用户的提示:只需在您的~/.profile(或类似的文件名)中添加一个导出语句即可。例如: export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=256m" ...然后重新启动您的shell。这对我起了作用。 - Nathan Beach
16
如果要使用命令构建项目,请使用以下内容: -DXmx512m -DXX:MaxPermSize=128m - matt
2
在Unix系统中,将MAVEN_OPTS导出为“-Xmx512m -XX:MaxPermSize=128m”。 - Boris Pavlović
显示剩余6条评论

24
如果你想让这部分成为可重复构建的 POM 的一部分,你可以使用一些插件的 fork-variant(特别是compiler:compilesurefire:test)。
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
      <fork>true</fork>
      <meminitial>128m</meminitial>
      <maxmem>1024m</maxmem>
      <compilerArgs>
        <arg>-XX:MaxPermSize=256m</arg>
      </compilerArgs>
    </configuration>
  </plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18</version>
    <configuration>
        <forkCount>1</forkCount>
        <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
    </configuration>
</plugin>

3
最好将其加入到pom文件中,这样其他开发人员/环境就不会遇到OOME(OutOfMemoryError)了。 - AlikElzin-kilaka
不幸的是,它会随着Java版本的变化而改变,因此仍然可能需要一些标准化。(例如像Apache Commons一样使用%JAVA_1_7_HOME%(因为工具链可能还没有准备好在这些情况下使用)。) - eckes
在Java 1.8上运行构建时,添加此参数会导致JVM警告/错误吗? - djangofan
@djangofan 是的。(使用Java-8配置文件并不罕见。它们甚至可以使用JAVA_1_8_HOME,这将模拟一个简陋的工具链选择器) - eckes
最好的。像魔法一样运作。 - Washington Morais

16

当然,你可以增加永久代的大小。使用-XX:MaxPermSize=128m选项,并将值设置为适当的数值。


1
这是一个非常恼人的错误,我所做的是: 在Windows下:
Edit system environment variables - > Edit Variables -> New

然后填写。
MAVEN_OPTS
-Xms512m -Xmx2048m -XX:MaxPermSize=512m

enter image description here

然后重新启动控制台并再次运行maven构建。不会再出现Maven空间/perm大小问题。


1
当我遇到这个异常时,我通过使用“运行配置”面板来解决问题,如下图所示。特别是在JRE选项卡中,VM参数是关键("-Xmx1024m -Xms512m -XX:MaxPermSize=1024m -XX:PermSize=512m")。

enter image description here


0

当您尝试使用git mvn clean install构建war时,如果出现Maven构建错误“java.lang.OutOfMemoryError: PermGen space”,我已经找到了一个git bash命令的解决方案

use below command first 

$ export MAVEN_OPTS="-Xmx512m -Xss32m"

then use your mvn command to clean install /build war file

$ mvn clean install

NOTE: you don't need -XX:MaxPermSize argument in MAVEN_OPTS when your are using jdk1.8
Java HotSpot(TM) Client VM warning: ignoring option MaxPermSize=XXXm; support was removed in 8.0

0

当永久代堆栈已满并且我们中的一些人在Windows上使用命令提示符构建Maven项目时,我们会遇到此错误。由于我们需要增加堆大小,因此我们可以设置环境变量@ControlPanel/System and Security/System,并在那里单击更改设置,然后选择高级选项,如下所示设置环境变量:

  • 变量名称:MAVEN_OPTS
  • 变量值:-XX:MaxPermSize=128m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接