mvn test java.lang.OutOfMemoryError: невозможно создать новый собственный поток - PullRequest
5 голосов
/ 23 мая 2011

Когда я запускаю mvn test, я получаю следующее исключение.Я пробовал поднимать и опускать настройки Xmx и Xss JVM, а также преодолевать все ограничения под ulimit.Есть около 1300 тестов, и последние 200 всегда терпят неудачу с этим исключением.Запуск этих тестов сам по себе позволяет им пройти.Те же самые тесты проходят на моем Ubuntu Box.Я получаю это исключение при запуске тестов на моем 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 ]

4 голосов
/ 27 мая 2012

Я столкнулся с этой проблемой, используя плагин Maven Surefire (v2.12). Мне пришлось настроить верный огонь следующим образом:

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

Если я опущу элемент "forkMode" в моей конфигурации, я получу ошибку "неспособен создать новый собственный поток", потому что процесс java Surefire создаст тысячи потоков в противном случае, превысив мой предел ОС (Mac OSX - вы это можно увидеть в мониторе активности).

Насколько я могу судить, все новые потоки создаются, потому что по умолчанию «forkMode» в Surefire «один раз», и все новые потоки, которые создаются, не прерываются до тех пор, пока «один» верный процесс не завершится.

Последнее замечание: настройка параметров памяти JVM, похоже, не дала эффекта (хорошего или плохого). Использование значений по умолчанию работало нормально, как и следующее:

<argLine>-Xss512k -Xms512m -Xmx4096m -XX:MaxPermSize=2048m</argLine>
3 голосов
/ 07 января 2015

Относительно ответа Саппенина, вы должны использовать параметры конфигурации 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 голосов
/ 23 мая 2011

Вы (или кто-то, действующий от вашего имени) создаете слишком много потоков в ваших тестах. Подтвердите это, запустив jstack на разветвленном тестовом процессе, пока он почти наверняка покажет огромное и растущее число потоков.

Попробуйте ограничить размер пула потоков или убедитесь, что они распределены правильно. Если Mac поддерживает что-то вроде ulimit, вы можете увеличить максимальное количество потоков на процесс. Вы потерпите еще больший провал в Windows.

...