Я подсчитал потоки в последний раз, когда это произошло, используя ps -efL |wc -l, много ли 10000 потоков для нашего зверя, зная, что в этот момент потребление CPU / RAM было низким?
Это немалое количество потоков, но нет, 10K потоков - это не , а много, особенно для 30-ядерных компьютеров. 4-ядерный рабочий стол Windows, на котором я сейчас работаю, имеет ~ 3K.
Я использовал gstack, чтобы попытаться выяснить, где он застрял, но так как это ИДК программы JAVA, если вывод имеет смысл?
Я никогда не пытался отлаживать Java с помощью собственных стеков потоков, но эта трассировка стека, на мой взгляд, выглядит как «припаркованная» нить. Другими словами, поток в каком-то пуле потоков, который не имеет ничего общего, поэтому он ждет работы. См. этот ответ для получения более подробной информации.
Также перед тем, как убить процесс, я использовал gcore -o /tmp/dump.txt, это правильный способ получить corefile файлаJava-процесс?
Вероятно, он имеет какое-то значение, но я бы предложил использовать для этой работы специфичные для Java инструменты. Первое, что приходит на ум, это jcmd
, который идет с JDK. Вот ссылка , с которой можно начать. Версия Java 9 имеет некоторую лучшую документацию и очень похожа.
Что бы я конкретно сделал, это использовал команду Thread.print
jcmd
для печати трассировок стека java-уровня иGC.heap_dump
для сброса всей кучи Java в файл .hprof
, который впоследствии можно проанализировать с помощью таких инструментов, как MAT .
Если вы используете JDK 8 с «Коммерческие функции» , вы также можете включить JFR (Java Flight Recorder , который отслеживает выполнение процесса. Файлы, созданные JFR, могут быть открыты либо с помощью Oracle's Mission Control", или альтернативный" Mission Control ", такой как от Azul, называемый Zulu .
Наконец, вы также можете попытаться подключиться к процессу, используя jconsole , еще один инструмент, поставляемый с JDK.
Удачи.