Запуск 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 ...
- используя
-Fвсе в порядке для принятия кучи дампа? - Я жду 20 минут и еще не закончена. Есть идеи почему?
3 ответов:
jmapиjmap -F, а такжеjstackиjstack -Fиспользуйте совершенно другие механизмы для связи с целевой JVM.jmap / jstack
при запуске без
-Fэти средства использовать Динамический Механизм Присоединения. Это работает следующим образом.
перед подключением к Java process 1234,
jmapсоздает файл.attach_pid1234в рабочем каталоге целевого процесса или при/tmp.затем
jmapпередаетSIGQUITк целевому процессу. Когда JVM ловит сигнал и находит.attach_pid1234начинаетсяAttachListenerнить.
AttachListenerпоток создает сокет Unix/tmp/.java_pid1234для прослушивания команд из внешних инструментов.по соображениям безопасности при подключении (от
jmap) принимается, JVM проверяет, что учетные данные сокета равныeuidиegidпроцесса СПМ. Вот почемуjmapне будет работать, если выполняется другим пользователем (даже корнем).
jmapподключается к сокету и отправляет .эта команда считывается и исполняется
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.
jmap -FвызываетPTRACE_ATTACHна целевой JVM. Целевой процесс безоговорочно приостанавливается в ответ наSIGSTOPсигнал.инструмент считывает память JVM с помощью
PTRACE_PEEKDATA.ptraceможет читать только одно слово за раз, поэтому слишком много вызовов требуется для чтения большой кучи целевого процесса. Это очень и очень медленно.инструмент реконструирует внутренние структуры JVM на основе знаний конкретной версии JVM. Поскольку разные версии JVM имеют разную компоновку памяти,
-Fрежим работает только еслиjmapпроисходит из того же JDK, что и целевой процесс Java.инструмент сам создает дамп кучи, а затем возобновляет работу с целью процесс.
плюсы.
никакого сотрудничества с целевой виртуальной машины 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