Java: невозможно создать новый собственный stream

У меня есть приложение Java, которое размещено на веб-хостинге компании. Каждые несколько дней мое приложение идет вниз:

[2011-03-09 15:52:14,501] ERROR http-12021-9 java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:597) 

Хостинг-компании говорят, что это означает, что у моего приложения протекает память, но инструменты, которые у меня есть, показывают свободную память, по-прежнему доступны. Поскольку ошибка всегда создает новый собственный stream, я считаю, что проблема связана с ресурсами JVM config / OS.

Как предотвратить эту ошибку?

Скорее всего, проблема с JVM на веб-сервере. Пожалуйста, ознакомьтесь со следующей ссылкой для некоторых деталей,

http://blog.egilh.com/2006/06/2811aspx.html

Одна из возможностей заключается в том, что вы достигли лимита пользователя для количества открытых файлов.

Я считаю, что каждый Process / Thread потребляет один или несколько дескрипторов файлов.

Например, когда это происходит для вашего пользователя, команда «no» shell будет работать, так как команды оболочки отключают выполняемый процесс (вы видите ошибки типа «-bash: fork: retry: Resource временно неansible»)

Я попал в эту проблему и обнаружил, что только текущий пользователь не смог запустить procs … другие пользователи были неэффективны.

Чтобы разрешить, настройте настройку ulimit -n (max files open) … подробнее.

Вы можете видеть свои пользовательские ограничения с помощью команды:

 ulimit -a 

Увеличьте максимальный предел файла следующим образом:

 ulimit -n 65536 

Вот что я имею прямо сейчас:

 $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 256797 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 75000 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 100000 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 

Чтобы увидеть все явные ограничения для вашей системы:

 cat /etc/security/limits.conf 

Обратите внимание: я использую Oracle Linux 6.3 – результаты могут немного отличаться между дистрибутивами.

Когда вы запускаете свой процесс, JVM имеет ограниченный размер кучи (по умолчанию 128 МБ). У этого сервера может быть больше памяти, но ваша JVM не делает – вы использовали все это.

Вы можете изменить это с -Xmx аргументов командной строки -Xms и -Xms , но я бы предложил сначала найти утечку памяти 🙂

Вы отслеживали память? Запустите jconsole и просмотрите или зарегистрируйте потребление памяти в течение 24 часов. Если он (в среднем) идет вверх, не возвращаясь назад, тогда у вас заканчивается память и, возможно, недостаточно памяти для хранения деталей вашего нового streamа.

Проблема в том, что linux обрабатывает no.of открытых файлов. Дайте следующим образом ulimit -n 65536 (любое число u может дать)

Похоже на утечку нити. Темы создаются, но затем застряли где-то. Периодически выгружайте streamи, чтобы узнать, растет ли количество выделенных streamов. Ищите любые спящие / висящие нити в дампе.

 kill -QUIT jvm_pid 
  • Фрагментация LOH - обновление до 2015 года
  • Давайте будем гением компьютера.