【问题标题】:Is it possible to take thread dump of a java process in the container from the host?是否可以从主机中获取容器中 Java 进程的线程转储?
【发布时间】:2017-11-17 22:12:20
【问题描述】:

我的 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)

【问题讨论】:

  • 除了 jstack 之外,是否可以从主机运行 kill -3 pid?
  • 是的,马克。虽然您可以使用 docker 本身发送信号。 docker kill --signal SIGQUIT

标签: java docker docker-container


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2019-06-28
    • 2011-09-04
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多