jstack:似乎不是HotSpot VM(在远程进程中找不到符号“gHotSpotVMTypes”)

6

我们正在使用Java 8上的Wildfly 11,并在Amazon Linux上运行。最近,我们安装了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)

我不敢相信 SO 上没有关于这个的帖子。无论如何,不确定发生了什么事情,真诚期待反馈。


1
你解决了吗? - Gordon Thompson
6个回答

4

首先,我认为您使用了错误的PID运行jstack - 应该是Java进程的PID。因此,您应该尝试使用而不是PID 1992:

sudo jstack 2044

话虽如此,即使指定正确的 PID,我也遇到了这个问题。当以 root 用户身份运行命令时,堆栈跟踪/堆转储失败。将当前用户更改为拥有该进程的用户可解决该问题!

尝试运行:

sudo su - jboss
jstack 2044

1

我认为错误可能是由于附加到命令的错误进程ID引起的,首先必须确保编译项目和安装的JVM版本使用相同的Java版本,然后确保正确的进程ID被传递给所使用的命令,无论是“jstack”还是“jmap”,您可以使用以下命令查找正确的进程ID,很可能是第二个输出列中的值:

ps -fu jboss | grep java

这对我来说是个答案。当我错误地指向一个根本不是JVM的进程的PID时,我就遇到了这个错误。 - undefined
1
当我意外传递了错误的进程ID时,我也遇到了相同的错误。 - undefined

1

我目前也有同样的问题,但在确定jstack是相似/匹配版本之前,我遇到了不同的问题。这是我的建议。现在,我正在使用jstack 1.8_191,但我的JVM是1.8_181,我认为这不是一个问题,但也许这就是你的问题所在。 希望能帮到你。


1

感谢您提出这个问题,我最近也遇到了这个问题。

使用一些OpenJDK 1.8的较小版本进行测试后,我确认问题不在于OpenJDK jstack,如下所示,在Tests section中有-F。问题是JDK的SA差异,即您编译项目和用于调试的JDK之间的差异,在您的情况下是OpenJDK 1.8.181。

解决方法是使用这个新的JDK重新编译项目,即OpenJDK。

原因

经过一些研究,我发现了这本书 Java性能比较,作者是Charlie Hunt等人,其中描述了这个问题,或者一个非常类似的问题,描述如下:原因是服务性代理(SA)无法打开传输的核心文件。请注意保留HTML标签。
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)

以下为测试内容

OPENJDK-1.8.0.191

[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

OPENJDK-1.8.0.222

[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


0

昨天我遇到了这个问题,原因似乎是Java进程异常,ps -ef | grep java | grep xxx无法获取我想要的特定进程。首先检查Java进程状态,希望能有所帮助。


0

这似乎是由JDK版本不匹配引起的。确保您运行的Java进程使用与您的//等实用程序相同的JDK 启动

确保安全更新或其他更新在此期间未更新您的JDK。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接