質問
ssh -D 9696 login@ip.of.external.machine
および visualvm.exe -J-Dnetbeans.system_socks_proxy = localhost:9696 -J-Djava.net.useSystemProxies = true
はvisualvmを起動しますが、外部マシンのプロセスは表示されません(visualvm自体のようなローカルプロセスのみ)。さらに、(常にではないが)メッセージ「チャネル3:オープンに失敗しました:接続に失敗しました:接続が拒否されました」を受け取りました。私のsshウィンドウで。
サポートが必要ですか
解決
リモート側でjstatdを実行するか、host:portを使用してJMX接続を指定する必要があります。
Jstatd:
jstatd -J-Djava.security.policy = permissions.txt [-p port]
その後:ターゲットマシンにリモート接続を追加し、そのリモート接続のプロパティでjstatd接続を設定します。
(permissions.txtには、たとえば次が含まれます:
grant {
permission java.security.AllPermission;
};
編集:(コメントへの回答)
-
ssh -D 9696 me @ remote
、リモートコマンドラインで上記のようにjstatdを実行します。 jstatdをデフォルトの1099とは異なるポートに配置する場合は、jstatdに-p引数を使用します。 - ローカルマシンで
visualvm.exe -J-Dnetbeans.system_socks_proxy = localhost:9696 -J-Djava.net.useSystemProxies = true
を実行 -
visual vm:新しいリモート接続を追加し、リモートをjstatdのホストおよびポートとして指定します(デフォルトは1099、またはjstatdの実行時に-pで指定したもの)
visualvmでリモート側のプロセスが表示されるはずです
他のヒント
標準SSHトンネリングを使用し、ファイアウォールポートなしを使用して開く別のソリューションがあります。 私にとって、SOCKSプロキシは機能しません。
オプションを使用してJVMを起動します:
-Dcom.sun.management.jmxremote = true
-Dcom.sun.management.jmxremote.ssl = false
-Dcom.sun.management.jmxremote.authenticate = false
-Dcom.sun.management.jmxremote.port = [port1]
-D java.rmi.server.hostname = localhost
-Dcom.sun.management.jmxremote.rmi.port = [port2]
重要な部分は" server.hostname = localhost"です。さらに、両方のポート(connect +" random" RMI port)、" jmxremote.rmi.port"を明示的に定義します。少なくともJava 7アップデート4が必要です(どこかで読んだのですが、この情報を確認しませんでした-サーバーマシンで「lsof -i」を使用して、実際に使用されているポートを確認してください)。
(もちろん、認証またはSSLを使用できます。)
sshを介してサーバーに接続し、ローカルの port1 および port2 をサーバーのlocalhost:port1 | 2に転送します。
VisualVMで、localhost:port1へのJMX接続を開きます(プロキシ設定なし)。
localhostでjstatdバインディングの問題が発生したため、入力する必要がありました
jstatd -J-Djava.security.policy=allPerm.policy -J-Djava.rmi.server.logCalls=true -p <port> -J-Djava.rmi.server.hostname=<my ip>
jvisualvmの場合も、代わりにこのパラメーターを使用します
jvisualvm -J-DsocksProxyHost=localhost -J-DsocksProxyPort=<socks-port>
この方法で、sshプロキシで接続すると、リモートマシンの実際のIPアドレスを使用できます。
この回答を盗み、私のサイトで完全なリマインダーを作成しました.. 私 アンコンを気にしないでください ところでこれをありがとう:)
jVisualVMをssh経由でリモートアプリケーションに接続しているときに同じ問題が発生していました。
このチュートリアルは、問題の解決に役立ちました。 http://issamben.com/how-to-monitor-remote- jvm-over-ssh /
この問題を解決するには、次のことを確認してください:
-
jvm設定で2つのポートを設定しました
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9011 -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.local.only=false
-
sshトンネルが正しく確立されている
ssh -i yourPermissionFile.pem -l username 101.101.101.101 -L 9010:localhost:9010 -L 9011:localhost:9011
jvm引数:
-J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
1.3.2を使用しているビルドでは機能しませんでした。
したがって、ツールを使用しました&gt;オプション&gt;ネットワークし、SOCKS設定で手動で設定します。
しかし、VisualVMはまだリモートプロセスを見つけられませんでした。次に、「プロキシホストなし」を削除しました。これはおそらくそれをブロックするため、localhostをリッスンする
プロキシのjvm引数で機能しないことがわかりました。少なくともバージョン1.3.3(ビルド111013)では。ツールでプロキシを設定&gt;オプション&gt;ネットワークは私のために働いた。また、システム全体のプロキシ設定も機能するはずですが、定義により他のすべてのネットワーク接続に影響します。
jvisualvmの別のバージョンを試してください(例: https://visualvm.github.io/ download.html )
SOCKSプロキシを使用しなかったため、jvisualvmで動作させることができませんでした(ssh -v -D 9696でjvisualvmに関連するものは表示されませんでした)。リモートアプリケーションはjvisualvmに登場しませんでした。ただし、VisualVMは数秒後にそれらを表示しました。
この質問は古いことは知っていますが、jstatを使用するよりも簡単な解決策をお勧めします。
SSHとJvisualvmのみを使用する
- sockproxyを使用したssh(ex ssh -D 6666 host@123.123.123.123)
- sockでjvisualvmを実行します(jvisualvm.exe -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 6666)
- JXMホストを追加(例:234.234.234.234:16000)
jvisualvmを使用して簡単にメモリリークを検出し、アプリケーションのCPU、RAMを監視します