Запуск jmap получение не удается открыть файл сокета



мне пришлось бежать jmap для того, чтобы взять дамп "кучи" мой процесс. но jvm вернулся:



Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding


поэтому я использовал -F:



./jmap -F -dump:format=b,file=heap.bin 10330
Attaching to process ID 10331, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03
Dumping heap to heap.bin ...



  1. используя -F все в порядке для принятия кучи дампа?

  2. Я жду 20 минут и еще не закончена. Есть идеи почему?

749   3  

3 ответов:

jmap и jmap -F, а также jstack и jstack -F используйте совершенно другие механизмы для связи с целевой JVM.

jmap / jstack

при запуске без -F эти средства использовать Динамический Механизм Присоединения. Это работает следующим образом.

  1. перед подключением к Java process 1234,jmap создает файл .attach_pid1234 в рабочем каталоге целевого процесса или при /tmp.

  2. затем jmap передает SIGQUIT к целевому процессу. Когда JVM ловит сигнал и находит .attach_pid1234 начинается AttachListener нить.

  3. AttachListener поток создает сокет Unix /tmp/.java_pid1234 для прослушивания команд из внешних инструментов.

  4. по соображениям безопасности при подключении (от jmap) принимается, JVM проверяет, что учетные данные сокета равны euid и egid процесса СПМ. Вот почему jmap не будет работать, если выполняется другим пользователем (даже корнем).

  5. jmap подключается к сокету и отправляет .

  6. эта команда считывается и исполняется AttachListener поток JVM. Все выходные данные отправляются обратно в сокет. Поскольку дамп кучи создается в процессе непосредственно JVM, операция выполняется очень быстро. Однако JVM может сделать это только при safepoints. Если точка безопасности не может быть достигнуто (например, процесс зависает, не отвечает или выполняется длительный GC),jmap будет тайм-аут и выйти из строя.

давайте обобщим преимущества и недостатки динамического присоединения.

плюсы.

  • дамп кучи и другие операции выполняются совместно JVM на максимальной скорости.
  • вы можете использовать любую версию jmap или jstack подключиться к любой другой версии виртуальная машина Java.

минусы.

  • инструмент должен быть запущен одним и тем же пользователем (euid/egid) в качестве целевого JVM.
  • может использоваться только на живых и здоровых JVM.
  • не будет работать, если целевой JVM запускается с -XX:+DisableAttachMechanism.

jmap-F / jstack-F

при запуске с -F инструменты переключиться в специальный режим, который имеет Точка Доступа В Исправности Агент. В этом режиме целевой процесс замораживается; инструменты считывают его память через средства отладки ОС, а именно:ptrace на Linux.

  1. jmap -F вызывает PTRACE_ATTACH на целевой JVM. Целевой процесс безоговорочно приостанавливается в ответ на SIGSTOP сигнал.

  2. инструмент считывает память JVM с помощью PTRACE_PEEKDATA. ptrace может читать только одно слово за раз, поэтому слишком много вызовов требуется для чтения большой кучи целевого процесса. Это очень и очень медленно.

  3. инструмент реконструирует внутренние структуры JVM на основе знаний конкретной версии JVM. Поскольку разные версии JVM имеют разную компоновку памяти,-F режим работает только если jmap происходит из того же JDK, что и целевой процесс Java.

  4. инструмент сам создает дамп кучи, а затем возобновляет работу с целью процесс.

плюсы.

    никакого сотрудничества с целевой виртуальной машины Java. Может использоваться даже на подвешенном процессе.
  • ptrace работает всякий раз, когда Привилегии уровня ОС достаточно. Е. Г. root может сбрасывать процессы всех других пользователей.

минусы.

  • очень медленно для больших куч.
  • инструмент и целевой процесс должны быть из одной версии из JDK.
  • безопасная точка не гарантируется, когда инструмент подключается в принудительном режиме. Хотя jmap пытается обрабатывать все особые случаи иногда бывает, что целевой JVM не находится в согласованном состоянии.

Примечание

есть более быстрый способ взять кучи дампов в принудительном режиме. Во-первых, создать coredump с gcore, затем запустить jmap над сгенерированным основным файлом. Смотрите связанные вопрос.

Я только что обнаружил, что jmap (и предположительно jvisualvm при использовании его для создания дампа кучи) обеспечивает, чтобы пользователь, запускающий jmap, должен быть тем же пользователем, который запускает процесс, пытающийся быть сброшенным.

в моем случае jvm, для которого я хочу дамп кучи, запускается пользователем linux "jboss". так где же sudo jmap -dump:file.bin <pid> сообщал "не удалось открыть сокет:", я смог захватить мой дамп кучи с помощью:

sudo -u jboss jmap -dump:file.bin <pid>

как ben_wing сказал, Вы можете работать с:

sudo -u jboss-as jmap -dump:file.bin <pid>

(в моем случае пользователь jboss-as, но ваш может быть jboss или какой-то другой.)

но этого было недостаточно, потому что он попросил у меня пароль ([sudo] password for ec2-user:), хотя я мог работать sudo без запроса пароля с другими командами.

Я нашел решение здесь, и мне просто нужно добавить еще один sudo первый:

sudo sudo -u jboss-as jmap -dump:file.bin <pid>

он работает с другими командами, как jcmd и jinfo тоже.

Comments

    Ничего не найдено.