Запуск jcmd с использованием JDK-11 в java-процессе JDK-8 не выполняется успешно

Я пытаюсь контролировать внутреннюю память tomcat с помощью jcmd, но получаю следующее исключение: Команда: jcmd 14533<pid of tomcat> VM.native_memory summary

Я установил 2 jdk's jdk-11 А ТАКЖЕ jdk-8.

Tomcat работает под управлением jdk-8 и jcmd использовал jdk-11 то у меня появилось следующее исключение:

com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file /proc/31752/root/tmp/.java_pid31752: target process 31752 doesn't respond within 10500ms or HotSpot VM not loaded
    at jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:100)
    at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58)
    at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)
    at jdk.jcmd/sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:114)
    at jdk.jcmd/sun.tools.jcmd.JCmd.main(JCmd.java:98)

Я прикрепил -XX:+StartAttachListener с процессом java, но это не сработало.

2 ответа

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

  1. PrivateTmp=yes, следует удалить. Поскольку PrivateTmp=yes создает личную папку /tmp, которая недоступна инструменту
  2. Если у вас ProtectSystem=strict, добавьте ReadWritePaths=/tmp/

Пройдите справочную страницу для конфигурации файла systemd unit

Это может быть проблема с правами пользователя: jmap должен запускаться с тем же пользователем, что и java-процесс. например, если владелецusera и это работает в докере, содержащем выполнение jmap от имени пользователя usera

docker exec --user usera -it container_id jmap -dump:format=b,file=/home/usera/memorydump.bin 1
Другие вопросы по тегам