Какой поток вызвал дамп кучи OutOfMemoryException

У меня есть приложение JBoss 4.2.1, работающее на JVM 7, которое запускает дампы кучи, когда выдает OutOfMemoryExceptions. У меня настроен jvm со следующими переключателями:

-Xms1498m -Xmx3000m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError

Я пытаюсь прочитать дампы кучи, чтобы выяснить, что именно вызвало мой OOME. Я вижу, что потребляются большие блоки памяти, но они несколько ожидаемы. То, что я ищу в данный момент, это «дымящийся пистолет».

Я уже открыл еще одну SO здесь проблему с отсутствующей памятью в моем дампе кучи, поэтому я пытаюсь выяснить, что JVM делала, когда произошел OOME.

Есть ли в дампе кучи что-нибудь, что указывало бы, какой поток вызвал OOME? Точнее, что делал звонок, вызвавший мой OOME? Я осознаю и понимаю, что в случае утечки памяти это может быть погоня за неправильным следом, но я хочу посмотреть, вижу ли я, какой поток вызвал исключение.

Есть ли способ использовать MAT, чтобы увидеть это?


person Eric B.    schedule 07.06.2016    source источник


Ответы (2)


Вы проверили обзор потоков в MAT? Обзор темы

Он не сообщит вам поток, вызвавший OOME, но предоставит информацию о сохраненной куче.

person SVashisth    schedule 07.06.2016
comment
Да - я просматривал обзор темы; благодаря. Но он не говорит мне, какой поток вызвал OOME, а просто какие потоки что выполняли. А учитывая, что у меня в списке 258 потоков, довольно сложно просмотреть каждый поток, чтобы определить, что каждый из них делал. Я могу сортировать по размеру сохраненной кучи, но это просто говорит мне, какой поток потреблял больше всего памяти. Он не говорит мне, какой поток вызвал сбой моей JVM. - person Eric B.; 07.06.2016
comment
Вы видите что-то вроде ‹br› Exception in thread main: java.lang.OutOfMemoryError в трассировке стека? - person SVashisth; 07.06.2016
comment
К сожалению нет. Я просто вижу трассировку стека и причину (вызванную: java.lang.OutOfMemoryError: пространство кучи Java), но не имя/номер потока-нарушителя. - person Eric B.; 07.06.2016

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

Что касается вашего фактического вопроса, я не верю, что вы можете знать, какой Thread вызвал OOME из дампа кучи, единственный способ - проверить вашу консоль или файл журнала, поскольку JVM печатает трассировку стека в стандартный вывод на OOME.

person Nicolas Filotto    schedule 07.06.2016
comment
Как я указал выше, я понимаю, что в OOME поток, вызывающий OOME, может ничего не доказывать. Тем не менее, я пытаюсь сопоставить несколько разных дампов, и если я увижу шаблон (например, поток, пытающийся выделить огромные блоки памяти), вызывающий OOME, это может помочь сузить круг моих интересов. Конечно, как вы упомянули, это может не иметь к этому никакого отношения. - person Eric B.; 07.06.2016
comment
прочитайте это, это может помочь для утечки памяти"> stackoverflow.com/questions/37593549/ - person Nicolas Filotto; 07.06.2016