5

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

3 回答 3

4

我使用 Maven Surefire 插件 (v2.12) 遇到了这个问题。我必须按如下方式配置surefire:

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

如果我在配置中省略了“forkMode”元素,我会收到“无法创建新的本机线程”错误,因为 java Surefire 进程会创建数千个线程,否则会超出我的操作系统限制(Mac OSX - 你可以看到这个在活动监视器中)。

据我所知,所有的新线程都被创建了,因为在 Surefire 中默认的“forkMode”是“once”,并且在“one”surefire 进程终止之前,任何新创建的线程都不会消失。

最后一点:调整我的 JVM 内存设置似乎没有效果(好或坏)。使用默认值正常工作,如下所示:

<argLine>-Xss512k -Xms512m -Xmx4096m -XX:MaxPermSize=2048m</argLine>
于 2012-05-27T17:38:45.563 回答
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

于 2015-01-07T17:55:34.397 回答
2

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

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

于 2011-05-23T17:43:15.863 回答