2011-05-23 49 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

相關問題