web-dev-qa-db-ja.com

VisualVM over ssh

私は読んだ Visual VM sshを介してリモートで

ssh -D 9696 [email protected]およびvisualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=trueはvisualvmを起動しますが、外部マシンのプロセスは表示されません(visualvm自体のようなローカルプロセスのみ)。さらに、(常にではないが)sshウィンドウに「チャネル3:オープンに失敗しました:接続に失敗しました:接続が拒否されました」というメッセージが表示されることがありました。

何か助け?

47
bgraves

リモート側でjstatdを実行するか、Host:portを使用してJMX接続を指定する必要があります。

Jstatd:

jstatd -J-Djava.security.policy=permissions.txt [-p port]

その後:ターゲットマシンにリモート接続を追加し、そのリモート接続のプロパティでjstatd接続を構成します。

(permissions.txtには、たとえば次が含まれます。

grant {
  permission Java.security.AllPermission;
};

編集:(コメントへの回答)

  1. ssh -D 9696 me@remote、およびリモートコマンドラインで上記のようにjstatdを実行します。 jstatdをデフォルトの1099とは異なるポートに配置する場合は、jstatdに-p引数を使用します。
  2. 実行visualvm.exe -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=trueローカルマシン上
  3. ビジュアルvm:新しいリモート接続を追加し、jstatdのホストおよびポートとしてremoteを指定します(デフォルトは1099、またはjstatdの実行時に-pで指定したもの)

    これで、visualvmのリモート側のプロセスが表示されるはずです。

38
ankon

標準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」です。さらに、両方のポート(接続+「ランダム」RMIポート)を明示的に定義します。「jmxremote.rmi.port」には少なくともJava 7 update 4(どこかで読んで、この情報を確認しませんでした) -サーバーマシンで「lsof -i」を使用して、実際に使用されているポートを確認します。

(もちろん、認証またはSSLを使用できます。)

Sshを介してサーバーに接続し、ローカルport1およびport2に転送しますlocalhost:port1 | 2サーバー。

VisualVMで、localhost:port1へのJMX接続を開きます(プロキシ設定なし)。

22
Thies

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
    
12
sam ben

ローカルホストで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アドレスを使用できます。

この答えを盗んで、私は my site ..で自分自身に完全なリマインダーを作成しました。

12
Endeios

また、jvm引数:

-J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true

1.3.2を使用しているビルドで動作しませんでした。

そのため、[ツール]> [オプション]> [ネットワーク]を使用し、SOCKS設定で手動で設定しました。

しかし、VisualVMはまだリモートプロセスを見つけられませんでした。次に、localhostをリッスンしている「プロキシホストなし」を削除しました。これによりおそらくブロックされたためです。

4
Tarjei Romtveit

プロキシのjvm引数で機能しないことがわかりました。少なくともバージョン1.3.3(ビルド111013)では。 [ツール]> [オプション]> [ネットワーク]でプロキシを設定するとうまくいきました。また、システム全体のプロキシ設定も機能するはずですが、定義により他のすべてのネットワーク接続に影響します。

3
kgambrah

Jvisualvmの別のバージョンを試してください(例: https://visualvm.github.io/download.html の最新版)

SOCKSプロキシを使用しなかったため、jvisualvmで動作させることができませんでした(ssh -v -D 9696でjvisualvmに関連するものは表示されませんでした)。リモートアプリケーションはjvisualvmに登場しませんでした。ただし、VisualVMは数秒後にそれらを表示しました。

0
Thomas Rebele

私はこの質問が古いことを知っていますが、jstatを使用するよりも簡単な解決策を提案します。

sSHとJvisualvmのみを使用する

  1. sockproxyを使用したssh(例ssh -D 6666 [email protected]
  2. sockでjvisualvmを実行します(jvisualvm.exe -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 6666)
  3. jXMホストを追加(例:234.234.234.234:16000)

Jvisualvmを使用して簡単にメモリリークを検出し、CPUを監視します。RAMアプリケーションの

0
Lê Tuấn