2011-05-23 70 views
4

当我运行mvn test时,收到以下异常。我曾尝试提升和降低我的Xmx和Xss JVM设置,并在ulimit下突破所有限制。有大约1300次测试,最后200次总是失败,并有此例外。自己运行这些测试可以让他们通过。相同的测试通过我的Ubuntu的盒子。在我的Mac上运行测试时收到此异常。我很确定它是一个环境问题,但我已经调整了我所知道的所有设置,绝对没有运气。mvn test java.lang.OutOfMemoryError:无法创建新的本机线程

我使用的是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

你应该得到一个线程转储失败了。它可能会为每个可能会变得混乱的测试分配一个线程。 – 2011-05-23 16:39:02

+0

嗯,我没有。我是否需要提供任何额外的mvn参数来获取?我正在使用surefire插件来运行测试。此外,我试图通过参数禁用分支测试,并没有帮助。 – Brad 2011-05-23 16:40:08

+0

另请参阅此答案[这里](http://stackoverflow.com/questions/2860889/cant-get-past-2542-threads-in-java-on-4gb-imac-osx-10-6-3-snow -leopard-32bit/6413546#6413546) – 2011-06-20 15:22:54

回答

3

我遇到了这个问题,使用Maven Surefire插件(v2.12)。我不得不配置万无一失如下:

<configuration> 
    <forkMode>always</forkMode> 
    ... other surefire config ... 
</configuration> 

如果我省略我的配置了“forkMode”元素,我会得到“无法创建新的本地线程”错误,因为Java神火过程将创造数千个线程否则,超出我的操作系统限制(Mac OSX - 您可以在活动监视器中看到这一点)。

尽我所知,所有的新线程都被创建了,因为默认的“forkMode”在Surefire中是“一次”,并且无论创建哪个新线程都不会停止,直到“one”surefire进程终止。

最后一点:调整我的JVM内存设置似乎没有任何影响(好或坏)。使用默认值正常工作,因为做了以下内容:

<argLine>-Xss512k -Xms512m -Xmx4096m -XX:MaxPermSize=2048m</argLine> 
+0

这工作!我并没有在我的pom中明确包含surefire插件(看起来像是自动包含了...),但将其定义为插件,更新到最新版本并提供'always'forkMode已解决此问题。谢谢!对于未来的观众来说,这里有一些关于surefire插件的文档:http://maven.apache.org/plugins/maven-surefire-plugin/usage.html – Brad 2012-05-31 03:18:26

2

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

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

+0

我的应用程序不在任何地方创建线程,因为它们无法在App Engine上使用。 Maven可能是,但在使用jconsole进行分析时,在测试执行期间,我只能看到〜25个线程。我已经将ulimit max进程设置为无限制......一切工作在Ubuntu上。我只是不知道我的Mac上有什么不同。 – Brad 2011-05-23 17:48:53

+0

在紧密循环中创建线程的一段代码可能会在不到半秒的时间内发生此类错误,因此可能会发生这种情况。也许运行某种分析器并观察那里的线程。 – krosenvold 2011-05-23 17:56:07

2

相关的sappenin的答案,你应该使用forkCount和reuseForks配置参数(而不是过时forkMode)的万无一失插件的更新版本。生成的插件配置可能与所示代码类似。

<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

相关问题