У меня есть решение для этого:
Если ваш Java-процесс выполняется в Linux за брандмауэром и вы хотите запустить JConsole / Java VisualVM / Java Mission Control в Windows на локальном компьютере, чтобы подключить его к JMX-порт вашего Java-процесса .
Вам необходим доступ к вашей машине с Linux через SSH. Все коммуникации будут проходить через SSH-соединение.
СОВЕТ: Это решение работает независимо от того, есть ли межсетевой экран или нет.
Недостаток: Каждый раз, когда вы перезагружаете ваш процесс Java, вам нужно будет снова выполнить все шаги с 4 - 9.
1. Вам нужен набор замазок для вашего компьютера с Windows здесь:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Как минимум putty.exe
2. Определите один свободный порт на вашем компьютере с Linux:
<jmx-remote-port>
* * Пример 1 042:
jmx-remote-port = 15666
3. Добавьте аргументы в процесс Java на машине Linux
Это должно быть сделано именно так. Если это сделано, как показано ниже, это работает для Linux-машин за брандмауэрами (работает из-за аргумента -Djava.rmi.server.hostname=localhost
).
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
* +1054 * Пример:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main
4. Получить идентификатор процесса вашего Java-процесса
ps -ef | grep <java-processname>
result ---> <process-id>
* * Пример тысяча шестьдесят три:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5. Найти произвольный порт для заглушек RMIServer
Процесс java открывает новый порт TCP на машине linux, где заглушки RMI Server будут доступны для загрузки. Этот порт также должен быть доступен через туннель SSH для подключения к виртуальной машине Java.
С помощью netstat -lp
этот порт можно найти также, lsof -i
дает подсказки, какой порт был открыт с помощью процесса Java.
ПРИМЕЧАНИЕ. Этот порт всегда изменяется при запуске процесса Java.
netstat -lp | grep <process-id>
tcp 0 0 *:<jmx-remote-port> *:* LISTEN 24321/java
tcp 0 0 *:<rmi-server-port> *:* LISTEN 24321/java
result ---> <rmi-server-port>
Пример: * * тысяча восемьдесят-три
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6. Включите два SSH-туннеля с вашего компьютера Windows с помощью putty
Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local
[x] Auto
Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local
[x] Auto
* * Пример тысяча девяносто-одина: * * один тысяча девяносто-дв
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7. Войдите на свой компьютер Linux с Putty с включенным SSH-туннелем.
Оставьте сеанс замазки открытым.
Когда вы вошли в систему, Putty будет туннелировать все TCP-соединения к машине linux через SSH-порт 22.
JMX-порт:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Сто-порт:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Запустите JConsole / Java VisualVM / Java Mission Control, чтобы подключиться к процессу Java, используя следующий URL-адрес
Это работает, потому что JConsole / Java VisualVM / Java Mission Control считает, что вы подключаетесь к порту на вашей локальной машине Windows. но Putty отправляет всю полезную нагрузку на порт 15666 на ваш Linux-компьютер.
Сначала на компьютере с Linux процесс Java дает ответ и отправляет обратно порт RMIServer. В этом примере 37123.
Затем JConsole / Java VisualVM / Java Mission Control считает, что он подключается к localhost: 37123, и putty отправит всю полезную нагрузку на машину linux
Java-процесс отвечает, и соединение открыто.
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
* +1131 * Пример:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9. НАСЛАЖДАЙТЕСЬ № 8 -]