java.lang.OutOfMemoryError: невозможно создать новый собственный поток - PullRequest
6 голосов
/ 17 августа 2010

я видел такой комментарий

В одном месте я видел эту проблему, если вы продолжаете создавать потоки и вместо вызова start () вызываете run () непосредственно для объекта потока.Это приведет к тому, что объект потока не будет разыменован ... Так что через некоторое время сообщение, неспособное создать новый собственный поток, появляется

на форумах Sun Java

В моем приложении изначально мы планировали использовать поток, но позже мы решили, что больше не нужно, поэтому мы просто вызываем run () вместо start ().Нужно ли выполнять ручную сборку мусора для нового threadClass (..)?

моя настройка запуска tomcat

-Xms1024m -Xmx1024m -XX:MaxPermSize=450m 

Ответы [ 3 ]

11 голосов
/ 17 августа 2010

Почему вы сначала создаете Thread?

Вместо этого ваш код должен реализовывать интерфейс Runnable.

Затем, когда вы решитечто вы хотите запустить его в потоке, просто создайте экземпляр Thread с Runnable в качестве аргумента и вызовите start() для объекта Thread.

Если вместо этого вы просто хотитезапустите его в своем текущем потоке, просто вызовите run() для вашего Runnable объекта.

Это имеет несколько преимуществ:

  • вы не задействуете какие-либо Thread объекты какесли вам не нужны отдельные потоки
  • , ваш код обернут в Runnable, который концептуально подходит ближе: вы не пишете какой-то особый вид Thread, не так ли?Вы просто пишете некоторый код, который можно выполнить / запустить.
  • Вы можете легко переключиться на использование Executor, которое дополнительно абстрагирует решение

ИИ последнее, но не менее важное: вы избегаете любой потенциальной путаницы в том, создан ли собственный ресурс потока.

4 голосов
/ 17 августа 2010

Когда вы вызываете метод run (), новый поток создавать не нужно.И ваши объекты будут собираться сборщиком мусора, когда на них нет ссылок.

Ваша другая часть кода может создавать много потоков.

Попробуйте использовать ThreadPoolExecutor (потокпула) в вашем коде, чтобы ограничить потоки в вашем приложении, и соответственно настроить размер пула потоков для повышения производительности.

Вы также можете проверить следующее для отладки вашей проблемы: (по ссылке из ссылки) ТамЕсть несколько вещей, которые нужно сделать, если вы столкнетесь с этим исключением.

  • Используйте команду PID lsof -p (платформы Unix), чтобы узнать, сколько потоков активно для этого процесса.
  • Определитьесли максимальное количество потоков на процесс определено операционной системой.Если лимит слишком мал для приложения, попробуйте увеличить лимит потоков для каждого процесса.
  • Изучите код приложения, чтобы определить, существует ли код, который создает потоки или соединения (например, соединения LDAP) и не уничтожаетих.Вы можете сбросить потоки Java, чтобы увидеть, было ли создано слишком большое число.
  • Если вы обнаружите, что приложение открывает слишком много соединений, убедитесь, что любой поток, созданный приложением, уничтожен.Корпоративное приложение (.ear) или веб-приложение (.war) работает под управлением долговременной JVM.Тот факт, что приложение завершено, не означает, что процесс JVM завершается.Крайне важно, чтобы приложение освободило все ресурсы, которые оно выделяет.Другое решение - приложение использует пул потоков для управления необходимыми потоками.
1 голос
/ 16 февраля 2015

Эта ссылка довольно хорошо описывает, как эта ошибка генерируется JVM: http://javaeesupportpatterns.blogspot.ro/2012/09/outofmemoryerror-unable-to-create-new.html

В основном это очень зависит от ОС. В RedHat Linux 6.5 (скорее всего, в других дистрибутивах / версиях и версиях ядра) max_threads = max_process x 2.

Максимальное количество потоков очень зависит от количества разрешенных процессов. Максимальное количество процессов зависит от установленной вами максимальной физической памяти.

Если вы заглядываете в файл limit.conf (на моем RHL 6.5 он находится в /etc/security/limits.d/90-nproc.conf). Подайте заявку в файл:

# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     **1024**
root       soft    nproc     unlimited

Вы увидите, что для пользователей без полномочий root это 1024 (что означает максимум 2048 потоков).

Чтобы увидеть максимальное количество потоков, которое может создать ваш пользователь, запустите эту команду "cat / proc / sys / kernel / threads-max" или "sysctl kernel.threads-max".

Чтобы решить такую ​​проблему (по крайней мере, это сработало для меня) от имени пользователя root, вам нужно увеличить максимально допустимое количество потоков:

echo 10000> / proc / sys / kernel / threads-max

Это влияет на всех пользователей и рут. Пользователь должен выйти из системы, а затем снова войти, чтобы настройки вступили в силу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...