mvn test java.lang.OutOfMemoryError:无法创建新的本机线程

时间:2011-05-23 15:52:20

标签: java maven jvm junit4 surefire

当我运行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)

3 个答案:

答案 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>

引用:http://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html

答案 2 :(得分:2)

您(或代表您的人)在您的测试中创建了太多线程。通过在分叉测试过程中运行jstack来确认这一点,它几乎肯定会显示出大量且越来越多的线程。

尝试限制线程池的大小或确保它们已正确分配。如果mac支持ulimit之类的东西,你可以增加每个进程的最大线程数。在Windows上你会失败得更厉害。