java - jstack:似乎不是 HotSpot VM(在远程进程中找不到符号“gHotSpotVMTypes”)
问题描述
我们在 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)
我不敢相信没有关于这个的帖子。无论如何不确定发生了什么并感谢反馈。
解决方案
首先,我相信您jstack
使用错误的 PID 运行 - 它应该是 java 进程的。因此,您应该尝试以下方法,而不是 PID 1992:
sudo jstack 2044
也就是说,即使指定了正确的 PID,我也遇到了这个问题。以 root 用户身份运行命令时堆栈跟踪/堆转储失败。将当前用户更改为拥有该进程的用户!
尝试运行:
sudo su - jboss
jstack 2044
推荐阅读
- django - Django 声明
- typescript - 类型 'null' 必须有一个 '[Symbol.iterator]()' 方法
- c# - 在 Topshelf 托管服务上启用来自特定来源的 CORS
- javascript - UWP PWA 中的备用通道
- loops - log4cl 的奇怪行为和迭代
- javascript - 如何在 nodejs 中处理超时(--ms-- 消息)
- php - PHP页面密码保护
- c# - 避免多个装备项目
- google-chrome-extension - 通过 chrome://extensions 安装时向页面公开函数
- react-native - 如何在按下另一个组件时启动基于本机的日期点击器?