web-dev-qa-db-ja.com

ホストからコンテナ内のJavaプロセスのスレッドダンプを取得することは可能ですか?

私の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)
10
hobgoblin

使用しているjstackバージョンは、ソフトウェアが実行しているのとまったく同じJVMバージョンのものである必要があります。

アプリケーションコンテナ内でjstackを実行すると機能します。

ソフトウェアでリモートデバッグサーバー/ jmxをアクティブ化した後、リモートデバッグでjstackを実行することもできます。

また、コンテナにjstackがない場合は、次のコマンドを実行することで、同じjvmで構築されたコンテナを実行できますが、jvmコンテナの同じpid名前空間でjstackが出荷されます。

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

4
user801247