可能性のある複製:
VisualVM over ssh
今日この問題を解決するのに数時間を費やし、ここで見つけた答えがうまくいかなかったので、この質問を書いて答えています。うまくいけば、これは他の人のために役立ちます。私が使用したソリューション以外のソリューションがある場合は、質問にもお気軽に回答してください。あなたの方がいいなら、代わりにあなたのものを受け入れます。
問題:VisualVMとjstatdを使用して、FreeBSDサーバー上のいくつかの自家製Java=アプリケーション(これはLinuxサーバーにも適用されるはずです)を監視しようとしていますが、VisualVMを取得できませんファイアウォールで割り当て済みのランダムなjstatdポートを転送した後でもサーバー上のプロセスを一覧表示すると、sockstatを使用して接続が行われていることがわかります。
Jstatdを実行するたびにファイアウォールルールを作成するのではなく(毎回新しいランダムポートが不愉快に選択されるため)、SSHトンネルで機能するようになりました。
まず、サーバーでjstatdを実行して、トンネリングに必要なポートを見つけました。これは(私の場合)最初にtools.policyというポリシーファイルを作成し、次の内容で行います。
grant codebase "file:${Java.home}/../lib/tools.jar" {
permission Java.security.AllPermission;
};
次に、次のコマンドを実行します:jstatd -J-Djava.security.policy=tools.policy
次に、sockstat | grep jstat
を実行して、jstatdが使用しているランダムなポートを特定しました(Linuxでは代わりにnetstat
を使用する必要があるかもしれませんが、わかりません)。
次に、ランダムポートが55663であるとしましょう。ローカルマシンに2つのSSHトンネルを作成しました。1つは標準のjstatdポート1099用、もう1つは55663用で、2つのターミナルウィンドウで次のコマンドを実行します(Windowsでは実行していませんが、 PuTTYがそれを実行できると私はかなり確信しています):
ssh -L 1099:localhost:1099 login_name@Host_name
ssh -L 55663:localhost:55663 login_name@Host_name
2つのトンネルが開いたら、VisualVMを開き、左側の「ローカル」マシンを右クリックして、「jstatd接続の追加」を選択しました。右側の「Add Default」ボタンをクリックして、ポートが1099に設定されていることを確認しました。「OK」ボタンをクリックして保存すると、すぐにリモートが表示されましたJavaプロセスが表示される「ローカル」セクション。
別のソリューションについては、この「 SOCKSを使用したsshトンネルを介したVisualVMの実行 」を参照してください。