OSX Maven运行测试时出现异常:线程“main”中的UncaughtExceptionHandler抛出java.lang.OutOfMemoryError。

11
我一直在尝试在Mac上运行一个已经在Linux下工作的Maven项目。当调用mvn clean install时,它会运行部分测试,然后我会得到以下错误: Exception in thread "main" Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main" 我看到有很多关于Perm gen错误的问题都可以通过添加 MAVEN_OPTS 到环境变量来解决。现在,我在我的系统上有以下环境变量: MAVEN_OPTS="-Xmx4096m -XX:MaxPermSize=4096m" 当调用mvn help:system时,我可以看到这些选项出现在配置中。
该项目使用Robolectric进行测试,并且(大多数情况下但并非总是)在抛出异常之前打印以下行: [DEBUG] ********************* **GC'ed SdkEnvironment reused! [ERROR] couldn't load org.robolectric.internal.ParallelUniverse in org.robolectric.bytecode.AsmInstrumentingClassLoader@300abe53 在活动监视器中,当我开始测试时,我可以看到一个Java进程开始运行。在抛出异常之前,它的内存使用量达到1.4~1.5GB。
还需要做什么才能使其正常工作?感谢您的帮助!
编辑:在确保插件中添加了内存选项后:
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>2.16</version>
               <configuration>
                   <argLine>-Xmx2048m -XX:MaxPermSize=2048m</argLine>
               </configuration>
           </plugin>

运行mvn clean install -e -X时,我得到了以下堆栈跟踪:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test (default-test) on project android: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test failed: There was an error in the forked process
[ERROR] java.lang.OutOfMemoryError: PermGen space
[ERROR] at java.lang.ClassLoader.defineClass1(Native Method)
[ERROR] at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
[ERROR] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
[ERROR] at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
[ERROR] at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
[ERROR] at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
[ERROR] at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
[ERROR] at java.security.AccessController.doPrivileged(Native Method)
[ERROR] at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
[ERROR] at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
[ERROR] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
[ERROR] at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
[ERROR] at org.apache.maven.surefire.report.SmartStackTraceParser.getMinimalThrowableMiniMessage(SmartStackTraceParser.java:166)
[ERROR] at org.apache.maven.surefire.report.SmartStackTraceParser.getString(SmartStackTraceParser.java:151)
[ERROR] at org.apache.maven.surefire.report.PojoStackTraceWriter.smartTrimmedStackTrace(PojoStackTraceWriter.java:61)
[ERROR] at org.apache.maven.surefire.booter.ForkingRunListener.encode(ForkingRunListener.java:328)
[ERROR] at org.apache.maven.surefire.booter.ForkingRunListener.encode(ForkingRunListener.java:312)
[ERROR] at org.apache.maven.surefire.booter.ForkingRunListener.toString(ForkingRunListener.java:258)
[ERROR] at org.apache.maven.surefire.booter.ForkingRunListener.testError(ForkingRunListener.java:132)
[ERROR] at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:162)
[ERROR] at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
[ERROR] -> [Help 1]

这是指Surefire需要2GB的内存,而Maven则需要4GB的内存。

1个回答

23

我通过添加另一个神奇的环境变量来解决了这个问题

JAVA_TOOL_OPTIONS="-Xmx1024m -XX:MaxPermSize=512m -Xms512m"


我遇到了同样的问题,但只有在通过TeamCity运行Maven构建时才会出现。因此,我将TeamCity Maven Build Step参数“JVM命令行参数”设置为“-Xmx1024m -XX:MaxPermSize = 512m -Xms512m”。非常感谢! - Julien Kronegg

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