Как выглядит дамп потока, когда JVM проводит время в GC
-
29-10-2019 - |
Вопрос
При профилировании Java-приложения отмечу интересный факт.Когда JVM находится в GC, спираль дамп потока смерти выглядит так:
общий Итак, в состоянии TIMED_WAITING
много потоков.Теоретически эту ситуацию можно легко найти в нормально работающем приложении (в данный момент приложение просто не имеет входящих запросов), но я не могу найти ни одного потока диспетчеризации одного запроса, делающего что-то полезное (номинальная скорость выполнения составляет около 100 л.с.).
Есть ли в этом поведении что-то несовместимое с сборщиком мусора или это просто совпадение?
Решение
Отвечаю только на заголовок вопроса:
<цитата>Как выглядит дамп потока, когда JVM находится в сборке мусора?
Ответ: у вас нет возможности получить такой дамп (обычным способом).
JVM обрабатывает запрос дампа потока только после достижения точки безопасности чего просто не может произойти в сборке мусора.
Но есть чит-способ получить дамп потока активного сборщика мусора с помощью недокументированной функции JVMTI AsyncGetCallTrace, которая упоминается в этом сообщении:
http://jeremymanson.blogspot.com/ 07.07.2010 / why-many-profilers-have-серьезный.html
Он также указывает на то, что Oracle Solaris Studio может использоваться для получения таких смешанных дампов нативных / Java-потоков.
Другие советы
Попробуйте jmap -histo: live с течением времени, вы можете сравнить вывод и увидеть, какие типы объектов растут.
У вас должен быть установлен JDK для jmap. http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html
Предупреждение, jmap интенсивный, он приостанавливает все потоки во время его работы, что должно длиться всего несколько секунд.Процессы могут дампить ядро, потому что это интенсивно, обычно это быстро и безопасно, но я видел, как он блокирует или убивает большие приложения, много-гигабитные кучи.
Я предполагаю, что у вас есть пул потоков, который ждет чего-то делать.Если ваш процесс эффективен и у вас есть даже 100 запросов в секунду, у вас могут возникнуть проблемы с отловом даже одного потока, который что-то делает.Я предлагаю вам посмотреть на загрузку процессора вашего процесса.Если это 50%, у вас есть 50% шанс обнаружить, что один поток (возможно, не поток запроса) что-то делает.
Если вы хотите увидеть, на что ваш сервер тратит свое время, я бы попробовал профилировщик, например VisualVM, или коммерческий профилировщик, например YourKit.
Выполнив поиск вашего кода в Google, я нашел другую версию http://grepcode.com/file/repo1.maven.org/maven2/org.mortbay.jetty/jetty-util/7.0.0.pre5 / org / mortbay / thread / QueuedThreadPool.java , однако я подозреваю, что ваши потоки TIMED_WAIT в этом блоке int he run () метод
общий