2

root ユーザー権限を持つリモートの Ubuntu サーバーで永続的な Java プログラムを実行しています。しばらくすると、一部の CPU コアの使用率が 100% に達します。ログには疑わしいものは何も表示されず、アプリケーションは引き続き機能しますが、スループットは低下します。

JVM がまだ実行されている間に原因を突き止めるために、JVM をデバッグするにはどうすればよいですか?

4

3 に答える 3

2

1 つのオプションは、Java 1.6 以降の JDK に含まれているVisualVMです。過去にいくつかの状況で役立つことがわかりました。

ローカル アプリケーションまたはリモート アプリケーションに接続できます。

リモート アプリに接続するにはjstatd、リモート サーバーで実行してからローカルで VisualVM を実行し、サーバーの IP アドレスを入力します。調べたいものを含む、実行中の Java アプリケーションのリストが提供されます。アプリケーションのリストに問題がある場合は、VisualVM Web サイトで適切なドキュメントを入手できます。

于 2012-06-06T14:17:31.237 に答える
2

でプロセスに接続しますjvisualvm

このツールを使用すると、実行中のプロセスに接続して、すべてのスレッドとその状態を表示できます。これにより、どのスレッドが常に起動しているかを見るだけで、どのスレッドが原因であるかがわかります。スレッド ダンプを実行して、各スレッドのスタック トレースを確認し、各スレッドが何を行っているかを確認できます。

これは、まさにこの種のデバッグのための非常に強力なツールです。JDK のみで配布されるため、アクセスするには JVM ランタイムがインストールされているだけでなく、それ以上のものが必要になります。JVM が実行しているのと同じバージョンの JDK をインストールしてください。

これを機能させるには、X ディスプレイを転送する必要があります。

于 2012-06-06T14:15:33.690 に答える
1

Linux でスタック トレースを表示したい場合は、単に発行しkill -SIGQUIT <java-program-pid>ます。これは、コードが実行されている場所を確認する 1 つの方法です。

于 2012-06-08T21:01:16.117 に答える