Как контролировать память для стеков потоков Java - PullRequest
2 голосов
/ 19 августа 2010

При запуске приложения Java EE на 32-битной jvm в Solaris x86 я получаю OutOfMemoryError: Cant создает собственный поток (или что-то подобное).
Это потому, что, насколько я понимаю, у jvm недостаточно памяти для стека нового потока.

Я использую JConsole и VisualVM 1.3 для мониторинга приложения, но я не знаю, как в этих инструментах называется «память стека». В VisualVM я могу контролировать пространство кучи и пространство permgen, в то время как JConsole показывает еще несколько областей памяти. Любая из этих областей памяти выделена для стека памяти? Я знаю, что это, конечно, не пространство кучи, а как насчет permgen или Non-heap (как это называется в JConsole)

1 Ответ

0 голосов
/ 19 августа 2010

Вы также можете попробовать JProfiler . В JProfiler вы можете получить подсказки от представлений потоков и состояний потоков в представлениях профилирования процессора. Вот скринкаст для того же.

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

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

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

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

...