Подключитесь к замороженному jvm с помощью JConsole и т. д.

Мы пытаемся профилировать удаленное приложение tomcat, работающее в производстве. Проблема в том, что все потоки в веб-пуле заблокированы, и это, похоже, не позволяет нам подключиться к jconsole, jmc и даже к YourKit. Все эти инструменты отлично работают, когда jvm работает нормально.

Ошибка от jconsole - это тайм-аут:

Could not connect to server1:9090 : Failed to retrieve RMIServer stub: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
java.net.SocketTimeoutException: Read timed out]
Could not connect to server1:9090. Make sure the JVM is running and that you are using the correct protocol in the Service URL (service:jmx:rmi:///jndi/rmi://server1:9090/jmxrmi).

Это затрудняет понимание того, что не так с нашим приложением. Сервер не использует много процессора и есть свободная память. Так что никакой явной нехватки ресурсов. JVM просто кажется мертвым

Версия Java: jdk1.7.0_75 Версия Tomcat: 7.0.65

Любые идеи о том, как подключиться к jvm, когда это так?


person Tommy    schedule 28.03.2016    source источник
comment
Может быть, вы можете попробовать jstack -F <pid>, чтобы принудительно создать дамп потока.   -  person Beck Yang    schedule 28.03.2016
comment
Что-нибудь в логах? Как насчет рабочего каталога процесса JVM? Что, если вы включите -XX:+HeapDumpOnOutOfMemoryError? Вполне возможно, что JVM просто настолько безмозглая, что не может поднять трубку...   -  person Christopher Schultz    schedule 29.03.2016
comment
начните с jstack -F ‹pid› stack-trace.log   -  person Sanj    schedule 29.03.2016
comment
@ChristopherSchultz: это не проблема с памятью. Мы думаем, что это что-то с загрузчиком классов в спящем режиме во время большого трафика.   -  person Tommy    schedule 29.03.2016


Ответы (1)


У вас есть несколько вариантов:

  1. Отправьте SIGQUIT (Linux) или Control-Break (Windows) и получите трассировку стека.
  2. Получите дамп ядра (gcore в Linux), а затем вы можете использовать инструменты JVM, такие как jstack и друзья, используя файл ядра.
person sunnychan77    schedule 29.03.2016
comment
Завершение процесса Java в Windows не делает ничего, кроме возврата подсказки - person Tommy; 29.03.2016
comment
SIGQUIT отличается от SIGKILL/SIGTERM и не уничтожает процесс Java. - person sunnychan77; 12.04.2016