При выполнении
jstack
и/или jmap
— Java сообщает об ошибке:
# jstack -F 31770 Attaching to process ID 31770, please wait... Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ...
Причин оказалось несколько.
Главное — процесс Tomcat-а, jstack
которого надо было получить, работал под Oracle Java, так как путь был указан в его конфигурационном файле:
# cd /usr/java/jdk1.6.0_45 # cat COPYRIGHT | grep Oracle Copyright � 2006, 2013, Oracle and/or its affiliates. Computer Software License (December 2007). Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065. other measures to ensure its safe use. Oracle Corporation Oracle and Java are registered trademarks of Oracle and/or from third parties. Oracle Corporation and its affiliates products, and services. Oracle Corporation and its
Но при этом Java отдавала информацию о версии OpenJDK:
# java -version java version "1.6.0_24" OpenJDK Runtime Environment (IcedTea6 1.11.11.90) (rhel-1.62.1.11.11.90.el6_4-x86_64) OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
Из-за разных версий Java — jstack
не мог корректно выполнить операцию.
При выполнении jstack
с прямым указанием пути — запрос обрабатывался нормально:
# /usr/java/jdk1.6.0_45/bin/jstack -F 31770 Attaching to process ID 31770, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.45-b01 ...
Осталось добавить указание $PATH
в файл профиля пользователя ~/.bashrc
, от которого выполнялась операция:
export JAVA_HOME='/usr/java/jdk1.6.0_45' export PATH="${JAVA_HOME}/bin:$PATH"
Перечитаем файл:
# . /root/.bashrc # echo $PATH /usr/java/jdk1.6.0_45/bin:/sbin:/bin:/usr/sbin:/usr/bin
Проверяем версию Java теперь:
# java -version java version "1.6.0_45" Java(TM) SE Runtime Environment (build 1.6.0_45-b06) Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
Запускаем jstack
:
# jstack -F 31770 Attaching to process ID 31770, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.45-b01 ...
Работает нормально и jmap
:
# jmap 31770 Attaching to process ID 31770, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.45-b01 0x0000000040000000 49K /usr/java/jdk1.6.0_45/jre/bin/java 0x00007ff36cab7000 108K /lib64/libresolv-2.12.so ...