是否可以从主机获取容器中 Java 进程的线程转储?

2022-09-03 15:52:07

我的 java 进程正在容器内运行。当然,我可以在主机上看到该过程,也可以看到它的pid。如果 jdk 没有安装在集群上,而是安装在主机上,我是否可以使用此 pid 从主机对 docker 容器中的 java 进程运行 jstack。顺便说一句,我试过了,遇到了以下错误

Attaching to process ID 66367, 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)

答案 1

您使用的 jstack 版本需要来自与软件运行的 JVM 版本完全相同的版本。

在应用程序容器中运行将起作用。jstack

您也可以在激活软件上的远程调试服务器/ jmx后在远程调试中运行。jstack

此外,如果你的容器没有 jstack,你可以运行一个使用相同 jvm 构建但附带 jstack 的容器,在 jvm 容器的同一 pid 命名空间中,通过运行:

docker run --pid=container:your_app your_jstack_images jstack $in_your_app_container_jvms_pid


答案 2

推荐