анализ процесса Java "не отвечает"? - PullRequest
0 голосов
/ 21 декабря 2018

Мой процесс Java перестал отвечать.Я попытался выполнить jstack, но потерпел неудачу с приведенной ниже ошибкой.

21039: 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, но "Не найдено взаимоблокировок".

Другая информация:

java версия: Java-версия

jmap: jmap

jstat: jstat

jinfo: jinfo

Может кто-нибудь помочь взглянуть и поделиться некоторыми ссылками по устранению проблемы такого типа Java "не отвечает"?

1 Ответ

0 голосов
/ 30 декабря 2018

Возможные причины проблемы Unable to open socket file:

  1. Целевой PID не является процессом JSM HotSpot.
    Это, очевидно, не ваш случай, поскольку jinfo PID работает нормально.
  2. JVM запускается с опцией -XX:+DisableAttachMechanism.
    Это также можно проверить с помощью jinfo PID.
  3. Соединительное гнездо /tmp/.java_pidNNN было удалено.
    Существует общаяпотренируйтесь автоматически очищать /tmp с помощью некоторого запланированного сценария.В этом случае вы должны настроить программу очистки так, чтобы она не удаляла файлы .java_pid*.

    Как проверить: запустите lsof -p PID | grep java_pid
    Если в нем указан файл сокета, но файл не существует, то этоэто точно описанная проблема.

  4. Учетные данные текущего пользователя (euid / egid) не соответствуют владельцу подключаемого сокета.Убедитесь, что вы запускаете jstack тем же пользователем, что и JVM.Присоединение не будет работать, если вы запускаете jstack другим пользователем, даже если этот пользователь является каталогом root.

  5. /tmp целевого процесса и не совпадает с /tmpвашей раковины.Это может произойти в следующих случаях:
    • JVM запущена в другом пространстве имен монтирования .Обычно это происходит, когда JVM работает в контейнере Docker.Помогает запуск jstack из того же контейнера.
    • JVM запускается в среде chroot.Например, контейнеры LXC могут использовать chroot.
      Как проверить: запустите readlink -f /proc/PID/root/tmp, чтобы увидеть, указывает ли он на /tmp или на какой-либо другой каталог.
  6. Текущий рабочий каталог целевой JVM принадлежит файловой системе, которая не позволяет изменять разрешения. CIFS и DrvFs (WSL) являются примерами таких файловых систем.

    Как проверить: запустите umask 077; touch /proc/PID/cwd/somefile.tmp, затем убедитесь, что владельцем файла являетесь вы, и файлразрешения: 600.

  7. JVM занята и не может достичь безопасной точки.Например, JVM находится в середине продолжительной сборки мусора.

    Как проверить: запустить kill -3 PID.JVM должна напечатать информацию о дампе и куче в своей консоли.Если JVM ничего не выгружает, но процесс потребляет почти 100% ЦП или показывает высокую загрузку ввода-вывода, то это похоже на описанную проблему.

  8. Процесс JVM приостановлен.

    Как проверить: запустить ps PID.Столбец STAT в активном процессе JVM должен иметь вид Sl.

Подробнее о внутренностях jstack.

Также имеется jattach проект, который является лучшей альтернативой jstack / jmap.Он может автоматически обрабатывать проблему с учетными данными, он работает с контейнерами Docker, поддерживает chroot-JVM и обрабатывает необычные файловые системы.

...