закончится ли бесконечное создание и запуск потоков в OOM PermGen? - PullRequest
3 голосов
/ 13 апреля 2011

В моем процессе я постоянно создаю новый объект Thread (фактически подкласс Thread) (до нескольких в секунду), запускаю его и чисто завершаю.

Я заметил, что, когда, например, процесс был запущен в течение 25 дней, он может умереть, оставив позади hprof, что означает OOM. Но дамп кучи крошечный по сравнению с выделенной памятью для кучи, поэтому, вероятно, это OOM PermGen, и я пытаюсь выяснить, кто виноват.

Я не использую никаких специальных запретов параметров jvm -XX: + HeapDumpOnOutOfMemoryError

Ответы [ 3 ]

0 голосов
/ 13 апреля 2011

Вы пытались использовать jhat , чтобы посмотреть на производимую свалку, а не просто предполагать, что это проблема перманента?Я не уверен, что существует прямая зависимость между размером файла hrof и размером создаваемой кучи.

0 голосов
/ 09 мая 2011

Я отвечаю на это, чтобы принести закрытие.После долгих исследований, по крайней мере, в моем случае, создание очень большого количества потоков не было виновником OOM.

Я исключил это двумя способами:

  1. проблема была зарегистрирована в другой паре случаев, и в этих случаях не было создано много потоков.

  2. Я создал тест, в котором я создал более 2,5 миллионов потоков (выполняя обычную работу, которую они делают в нашем случае) и не получил проблем с OOM.

Итакпросто очень большое количество созданных потоков не является проблемой.

0 голосов
/ 13 апреля 2011

Ваш дамп кучи, безусловно, должен сообщать вам об использовании PermGen - вы на это смотрели?

В любом случае, если загрузчик классов, который загружает класс, является GCd, то загруженные им классы также являются GCd; как правило, это единственный способ выгрузить класс. Вы должны подумать об использовании загрузчика классов на уровне приложения и периодически отказываться от него; это предотвратит проблему с памятью.

...