何らかの奇妙な理由で、VisualVM
またはjconsole
を使用してJMXに接続できません。
監視するVMの開始に使用されるパラメーター:
-Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.port=1100
私はチェックし、ローカルおよびリモートの両方からこのポートにtelnetで接続できます。
それでも、かなりの時間を費やした後、VisualVMまたはjconsoleは接続に失敗します。
REMOTE MACHINE with JMX (debian)
Java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)
MY WORKSTATION (OS X)
Java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
何が問題ですか?
-Djava.rmi.server.hostname = Host ip
を追加します。私も同じ問題に直面しました、そして、これはトリックをしました。
この-Djava.rmi.server.hostname = Host ip
を追加すると、RMIサービスは127.0.0.1ではなくホストIPを使用するようになります。
これらは私のために働いたステップです(サーバー側のファイアウォールの後ろのDebianは私のローカルMacからVPN経由で到達されました):
サーバーのパブリックIPを確認してください
ifconfig
JVMパラメーターを使用します。
-Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port = [jmx port] -Dcom.Sun.management.jmxremote.local.only = false -Dcom.Sun.management.jmxremote.authenticate = false- Dcom.Sun.management.jmxremote.ssl = false -Djava.rmi.server.hostname = [ステップ1のサーバーIP]
アプリケーションを実行する
実行中のプロセスIDを見つけるJavaプロセス
JMX/RMIが使用するすべてのポートを確認します
netstat -lp | grep [手順4のPID]
ファイアウォールで手順5のすべてのポートを開きます
出来上がり。
指定したポート(1100)をリッスンすることに加えて、JMXサーバーはランダムに選択された(一時的な)ポートもリッスンします。チェック、例lsof -i|grep Java
linux/osxを使用している場合、Javaプロセスがリッスンするポートであり、ファイアウォールが一時ポートに対しても開かれていることを確認します。
「追加」が永遠に表示され、接続できないように見えるという問題が発生しました。 jvisualvmプロキシ設定([ツール]-> [オプション]-> [ネットワーク])を変更することで問題を解決しました。オプションをプロキシなしに変更すると、接続できました。私のjvmは次のオプションで開始されました:
-Dcom.Sun.management.jmxremote
-Dcom.Sun.management.jmxremote.port=2222
-Dcom.Sun.management.jmxremote.authenticate=false
-Dcom.Sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=<external_IP_of_server>
次に、jmx接続を追加するときに、「external_IP_of_server:2222」を指定しました
ポートフォワーディングを使用すると、同様の問題が発生しました。 Tomcatがlocalhost:9000
でJMXインタラクションをリッスンしているリモートマシンがあります。
私のローカルマシンから、私はポートフォワーディングをするのに慣れています:
ssh -L 9001:localhost:9000 Tomcat.example.com
(したがって、リモートポート9000はローカルマシンのポート9001に転送されます)。
その後、VisualVMを使用してlocalhost:9001
に接続しようとしたときに、接続が拒否されました。 JMXでは、両側のポート番号が同一である必要があります。
だから私のソリューションはポート番号9000と9000を使用していました:
ssh -L 9000:localhost:9000 Tomcat.example.com
これで、ローカルマシンのVisualVMがlocalhost:9000
を介してリモートマシンのTomcatに正常に接続します。
同じポートでリッスンする他のサービス(開発マシンのTomcat?)がないことを確認してください。
パラメータを正しく設定する もご覧ください。
問題が見つかりました。rmiサービスは「127.0.0.1」のホストIPで実行されていました。リモートでjvmに接続するには、外部IPをホスト名にバインドする必要がありました。 UNIXシステムでこれを行うには、コマンドhostname
を使用してホスト名の名前を取得します。次に、ホスト名に割り当てられたIPを確認します。これを使用するには、ping $(hostname)
を使用して、システムがhosnameのIPをpingしていることがわかります。ホストIPがデフォルトの「127.0.0.1」で、変更したい場合は、ファイル/ etc/hostsをスーパーユーザーとして編集するだけです。 rmiサービスを再起動した後、リモートマシンからアクセスできます。
jar
ファイルを実行する場合(-jarオプションを使用)、-jar
オプションの前に他のすべてのオプションを指定する必要があります。
私は入社したばかりなので、ヘットの答えに賛成することはできませんが、試行錯誤の次の週から私の命を救いました!
これは、動作するDockerfileの例です。
FROM store/Oracle/serverjre:8
RUN mkdir -p /opt/app
ENV APP_PATH /opt/app
WORKDIR $APP_PATH
COPY . $APP_PATH
CMD ["Java", \
"-Dcom.Sun.management.jmxremote", \
"-Dcom.Sun.management.jmxremote.port=9010", \
"-Dcom.Sun.management.jmxremote.rmi.port=9010", \
"-Dcom.Sun.management.jmxremote.authenticate=false", \
"-Dcom.Sun.management.jmxremote.ssl=false", \
"-Djava.rmi.server.hostname=12.345.67.89", \
"-jar", \
"app-service-0.0.1-SNAPSHOT.jar"]
EXPOSE 9010
上記の答えに対する私の2セント。
ほとんどの回答では、ホスト名のみが言及されており、ポートは言及されていません。ポートを指定していない場合、サーバーは動的にRMIポートを割り当てます。両方のサーバーが同じサブネットにあるか、ファイアウォールの問題がない場合、問題はありません。懸念がある場合は、フリーズするJVMパラメーターを追加できます。
-Dcom.Sun.management.jmxremote.rmi.port
例:
<option name="-Dcom.Sun.management.jmxremote.rmi.port" value="11001"/>
RMIとJMXの両方のポートが同じであることを確認してください。詳細については、 ここをクリック
マシンの例に間違ったIPがない場合は、/ etc/hostsを見てください:127.0.0.1 localhost 127.0.0.2 your_machine 185.12.58.2 your_machine(マシンに適したIP)
JMXはIP 127.0.0.2を取得し、もう一方を忘れます