Java: Exception in thread "main" java.lang.reflect.InvocationTargetException

Автор: | 10/09/2013
 

java-logoПри выполнении jstack и/или jmapJava сообщает об ошибке:

# 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)

Из-за разных версий Javajstack не мог корректно выполнить операцию.

При выполнении 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
...