AttachNotSupportedException при попытке начать запись JFR

Я получаю AttachNotSupportedException при попытке начать запись JFR. Работало нормально до сих пор.

jcmd 3658 JFR.start maxsize=100M filename=jfr_1.jfr dumponexit=true settings=profile

Выход:

3658:
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
        at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
        at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63)
        at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208)

Что может происходить?

SO: Oracle Linux Server выпуск 6.7

$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

3 ответа

Решение

Одна из вероятных причин заключается в том, что /tmp/.java_pid1234 файл был удален (где 1234 - PID процесса Java).

Инструменты, зависящие от механизма динамического присоединения (jstack, jmap, jcmd, jinfo), взаимодействуют с JVM через сокет домена UNIX, созданный в /tmp, Этот сокет создается JVM лениво при первой попытке присоединения или охотно при инициализации JVM, если -XX:+StartAttachListener флаг указан.

После удаления файла, соответствующего сокету, инструменты не могут подключиться к целевому процессу, и, к сожалению, нет способа воссоздать коммуникационный сокет без перезапуска JVM.

Описание механизма динамического присоединения см. В этом ответе.

Другая возможность: ваше приложение работает под systemd с 'PrivateTmp=yes'. Это предотвращает поиск файла /tmp/.java_pid1234.

С личным опытом... Эта проблема также возникает в сценариях, где среда разработки делится на разделы, а раздел, в котором находится операционная система, отличается от раздела операционной системы. Например, раздел операционной системы - EXT4, а раздел среды разработки - NTFS (где JVM). Проблема возникает из-за того, что вы не можете создать файл "/tmp/.java_pid6024" (где 6024 - PID процесса java). Для устранения неполадок добавьте -XX: + StartAttachListener при запуске JVM или сервера приложений.

Другие вопросы по тегам