Как выглядит дамп потока, когда JVM проводит время в GC

StackOverflow https://stackoverflow.com/questions/8412303

Вопрос

При профилировании 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 () метод

общий
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top