java.lang.OutOfMemoryError: не удалось создать новый собственный поток

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

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

на форумах Sun Java

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

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

-Xms1024m -Xmx1024m -XX:MaxPermSize=450m 

6
задан Joachim Sauer 17 August 2010 в 08:55
поделиться

2 ответа

Почему вы в первую очередь создаете Thread ?

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

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

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

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

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

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

11
ответ дан 8 December 2019 в 14:38
поделиться

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

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

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

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

  • Используйте команду lsof -p PID (Unix платформы), чтобы узнать, сколько потоков активны для этого процесса.
  • Определите, существует ли максимум количество потоков на каждый определенный процесс операционной системой. Если предел слишком низкий для приложения, попробуйте повышение предела потока для каждого процесса.
  • Изучите код приложения, чтобы определить, есть ли код, создание потоков или соединений (например, как соединения LDAP), а не уничтожая их. Вы могли бы сбросить Потоки Java, чтобы увидеть, есть ли было создано чрезмерное количество.
  • Если вы обнаружите, что слишком много связей открываются приложением, сделайте убедитесь, что любой поток, который приложение создает уничтожается. An корпоративное приложение (.ear) или Интернет приложение (.war) работает под длительная JVM. Просто потому, что заявка завершена не означает что процесс JVM завершается. это обязательно, чтобы приложение было бесплатным любые ресурсы, которые он выделяет. Другое решение было бы для приложение для использования пула потоков для управлять необходимыми потоками.
4
ответ дан 8 December 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: