2017-01-17 8 views
1

Я получаю 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) 
+0

См. [Этот вопрос] (http://stackoverflow.com/questions/26140182/running-jmap-getting-unable-to-open-socket-file). Убедитесь, что вы запускаете 'jcmd' тем же пользователем, с какой работает Java-процесс. Убедитесь, что каталог '/ tmp' доступен для записи. Кроме того, 'jcmd' не будет работать, если целевой JVM будет висели. – apangin

+0

@apangin 'jcmd' выполняется одним и тем же пользователем,/tmp доступен для записи, а JVM не висит. – hbelmiro

+0

Является ли процесс Java запущенным под chroot или cgroups? – apangin

ответ

2

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

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

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

Описание Dynamic Attach Mechanism см. this answer.

0

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

0

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