root ユーザー権限を持つリモートの Ubuntu サーバーで永続的な Java プログラムを実行しています。しばらくすると、一部の CPU コアの使用率が 100% に達します。ログには疑わしいものは何も表示されず、アプリケーションは引き続き機能しますが、スループットは低下します。
JVM がまだ実行されている間に原因を突き止めるために、JVM をデバッグするにはどうすればよいですか?
root ユーザー権限を持つリモートの Ubuntu サーバーで永続的な Java プログラムを実行しています。しばらくすると、一部の CPU コアの使用率が 100% に達します。ログには疑わしいものは何も表示されず、アプリケーションは引き続き機能しますが、スループットは低下します。
JVM がまだ実行されている間に原因を突き止めるために、JVM をデバッグするにはどうすればよいですか?
1 つのオプションは、Java 1.6 以降の JDK に含まれているVisualVMです。過去にいくつかの状況で役立つことがわかりました。
ローカル アプリケーションまたはリモート アプリケーションに接続できます。
リモート アプリに接続するにはjstatd
、リモート サーバーで実行してからローカルで VisualVM を実行し、サーバーの IP アドレスを入力します。調べたいものを含む、実行中の Java アプリケーションのリストが提供されます。アプリケーションのリストに問題がある場合は、VisualVM Web サイトで適切なドキュメントを入手できます。
でプロセスに接続しますjvisualvm
このツールを使用すると、実行中のプロセスに接続して、すべてのスレッドとその状態を表示できます。これにより、どのスレッドが常に起動しているかを見るだけで、どのスレッドが原因であるかがわかります。スレッド ダンプを実行して、各スレッドのスタック トレースを確認し、各スレッドが何を行っているかを確認できます。
これは、まさにこの種のデバッグのための非常に強力なツールです。JDK のみで配布されるため、アクセスするには JVM ランタイムがインストールされているだけでなく、それ以上のものが必要になります。JVM が実行しているのと同じバージョンの JDK をインストールしてください。
これを機能させるには、X ディスプレイを転送する必要があります。
Linux でスタック トレースを表示したい場合は、単に発行しkill -SIGQUIT <java-program-pid>
ます。これは、コードが実行されている場所を確認する 1 つの方法です。