当我运行mvn test
时,我收到以下异常。我已尝试升级和降低我的Xmx和Xss JVM设置,并在ulimit下突破所有限制。大约有1300个测试,最后200个测试总是因此异常而失败。自己运行这些测试允许它们通过。相同的测试在我的ubuntu盒子上传递。我在mac上运行测试时收到此异常。我很确定这是一个环境问题,但我已经完全调整了我所知道的每一个设置。
我使用的是mvn 2.1和Java 6.我的测试框架是junit 4.8。
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:658)
at java.util.concurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize(ThreadPoolExecutor.java:727)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:657)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:92)
at com.google.appengine.tools.development.ApiProxyLocalImpl$PrivilegedApiAction.run(ApiProxyLocalImpl.java:197)
at com.google.appengine.tools.development.ApiProxyLocalImpl$PrivilegedApiAction.run(ApiProxyLocalImpl.java:184)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.ApiProxyLocalImpl.doAsyncCall(ApiProxyLocalImpl.java:172)
at com.google.appengine.tools.development.ApiProxyLocalImpl.makeAsyncCall(ApiProxyLocalImpl.java:138)
答案 0 :(得分:4)
我使用Maven Surefire插件(v2.12)遇到了这个问题。我必须按如下方式配置surefire:
<configuration>
<forkMode>always</forkMode>
... other surefire config ...
</configuration>
如果我在配置中省略了“forkMode”元素,我会得到“无法创建新的本机线程”错误,因为java Surefire进程会创建数千个线程,否则会超出我的操作系统限制(Mac OSX - 你可以在活动监视器中看到这一点。
正如我所知,所有新线程都被创建,因为Surefire中的默认“forkMode”是“一次”,并且无论新创建的线程是什么,都不会消失,直到“one”surefire进程终止。
最后要注意的是:调整我的JVM内存设置似乎没有任何影响(好的或坏的)。使用默认值可正常工作,如下所示:
<argLine>-Xss512k -Xms512m -Xmx4096m -XX:MaxPermSize=2048m</argLine>
答案 1 :(得分:3)
与sappenin的答案相关,你应该使用forkCount和reuseForks配置参数(而不是弃用的forkMode)来获得更新版本的surefire插件。生成的插件配置可能类似于显示的代码。
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<forkCount>1</forkCount>
<reuseForks>false</reuseForks>
<argLine>-Xms256m -Xmx1024m</argLine>
</configuration>
</plugin>
</plugins>
</build>
答案 2 :(得分:2)
您(或代表您的人)在您的测试中创建了太多线程。通过在分叉测试过程中运行jstack来确认这一点,它几乎肯定会显示出大量且越来越多的线程。
尝试限制线程池的大小或确保它们已正确分配。如果mac支持ulimit之类的东西,你可以增加每个进程的最大线程数。在Windows上你会失败得更厉害。