[英]jstack: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
我们在 Amazon Linux 上使用 Wildfly 11 和 Java 8。 我们最近安装了jstack
来解决 CPU 利用率高的问题,因为我们正试图找出导致 CPU 旋转的代码。 首先我们得到了 Wildfly 进程的 PID……
[myuser@prodmachine ~]$ ps -elf | grep java
0 S jboss 1992 1 0 80 0 - 28275 - Aug30 ? 00:00:00 /bin/sh /usr/java/wildfly/bin/standalone.sh -c standalone.xml
0 S jboss 2044 1992 45 80 0 - 7336044 - Aug30 ? 5-13:38:33 /usr/java/default/bin/java -D[Standalone] -server -Xms64m -Xmx25600m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=1024m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman,com.newrelic -java.awt.headless=true -javaagent:/usr/java/wildfly/newrelic/newrelic.jar -Dorg.jboss.boot.log.file=/usr/java/wildfly/standalone/log/server.log -Dlogging.configuration=file:/usr/java/wildfly/standalone/configuration/logging.properties -jar /usr/java/wildfly/jboss-modules.jar -mp /usr/java/wildfly/modules org.jboss.as.standalone -Djboss.home.dir=/usr/java/wildfly -Djboss.server.base.dir=/usr/java/wildfly/standalone -c standalone.xml
0 S 602 3630 1884 0 80 0 - 27617 pipe_w 14:19 pts/1 00:00:00 grep --color=auto java
但是,当我运行jstack
命令时,我收到了这个奇怪的错误:
[myuser@prodmachine ~]$ sudo /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-8.b13.39.39.amzn1.x86_64/bin/jstack -F 1992
[sudo] password for myuser:
Attaching to process ID 1992, please wait...
Error attaching to process: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
sun.jvm.hotspot.debugger.DebuggerException: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:411)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
at sun.tools.jstack.JStack.main(JStack.java:106)
我不敢相信没有关于这个的帖子。 无论如何不确定发生了什么并感谢反馈。
首先,我相信您使用错误的 PID 运行jstack
- 它应该是 java 进程的那个。 因此,您应该尝试以下方法,而不是 PID 1992:
sudo jstack 2044
也就是说,即使指定了正确的 PID,我也遇到了这个问题。 以 root 用户身份运行命令时堆栈跟踪/堆转储失败。 将当前用户更改为拥有该进程的用户!
尝试运行:
sudo su - jboss
jstack 2044
目前,我有同样的问题,但是在确保jstack是相似/匹配的版本之前,我有另一个问题。 那是我的建议。 现在,我正在使用jstack 1.8_191,但是我的JVM是1.8_181,我认为这不是问题,但是也许与您的问题相同。 希望能有所帮助。
感谢您提出这个问题,我最近才谈到这个问题。
做一些测试与OpenJDK的1.8一些小的版本,我可以证实,这个问题是不是OpenJDK的jstack,它具有-F,如下图所示,在Tests section
。 问题是在您的案例OpenJDK 1.8.181上,您在编译项目的JDK和您用于调试的JDK上存在SA差异。
解决方法是使用您正在使用的新JDK(在本例中为OpenJDK)再次编译项目。
经过一番研究,我找到了查理·亨特(Charlie Hunt et al。) 撰写的 《 Java性能比较》 一书 ,它描述了这个问题,或者是一个非常类似的书,其描述如下,其原因是服务性代理SA不是能够打开已传输的核心文件。
When using SA when transported core files, we may get failures related to rtld_db or libthread_db mismatch_db mismatch, or SA may throw an error that some HotSpot symbol is missing on the target process. The stack provided is
Error attaching to process: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
sun.jvm.hotspot.debugger.DebuggerException: Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVMTypes" in remote process)
at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:411)
at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jstack.JStack.runJStackTool(JStack.java:140)
at sun.tools.jstack.JStack.main(JStack.java:106)
[fdemeloj@fdemeloj jdk1.8.0_181]$ cd bin/
[fdemeloj@fdemeloj bin]$ ls
appletviewer javafxpackager jdb jrunscript pack200 unpack200
ControlPanel javah jdeps jsadebugd policytool wsgen
extcheck javap jhat jstack rmic wsimport
idlj javapackager jinfo jstat rmid xjc
jar java-rmi.cgi jjs jstatd rmiregistry
jarsigner javaws jmap jvisualvm schemagen
java jcmd jmc keytool serialver
javac jconsole jmc.ini native2ascii servertool
javadoc jcontrol jps orbd tnameserv
[fdemeloj@fdemeloj bin]$ ./jstack --help
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
[fdemeloj@fdemeloj java-1.8.0-openjdk-1.8.0.222.b10-4.static.jdk.openjdkportable.x86_64]$ cd bin/
[fdemeloj@fdemeloj bin]$ ls
appletviewer java jconsole jps native2ascii schemagen xjc
clhsdb javac jdb jrunscript orbd serialver
extcheck javadoc jdeps jsadebugd pack200 servertool
hsdb javah jhat jstack policytool tnameserv
idlj javap jinfo jstat rmic unpack200
jar java-rmi.cgi jjs jstatd rmid wsgen
jarsigner jcmd jmap keytool rmiregistry wsimport
[fdemeloj@fdemeloj bin]$ ./jstack --help
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
昨天发生在我身上,原因似乎是java进程异常,ps -ef | grep java | grep xxx无法获取我想要的特定进程。 首先检查Java进程状态,希望有帮助
这似乎是由 JDK 版本不匹配引起的。 确保您正在运行的 Java 进程是使用与jmap
/ jstack
/etc 相同的 JDK启动的。 效用。
确保安全更新等没有同时更新您的 JDK。
我认为错误可能是由于附加到命令的进程 ID 错误,您必须首先确保在您编译的项目和安装的 JVM 版本之间使用相同版本的 Java 然后确保正确进程 id 被传递给使用的命令,无论是“jstack”还是“jmap”,您可以使用以下命令找到正确的进程 id,它很可能是第二个 output 列中的值,
ps -fu jboss | grep java | grep 野蝇
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.