jconsole로 액세스하기 위해 JVM에서 JMX를 활성화하는 방법은 무엇입니까?
jconsole로 액세스하기 위해 JVM에서 JMX를 활성화하는 방법은 무엇입니까?
답변:
관련 문서는 여기에서 찾을 수 있습니다.
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
다음 매개 변수를 사용하여 프로그램을 시작하십시오.
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.rmi.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
예를 들면 다음과 같습니다.
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar Notepad.jar
-Dcom.sun.management.jmxremote.local.only=false
반드시 필요한 것은 아니지만 그것 없이는 Ubuntu에서 작동하지 않습니다. 오류는 다음과 같습니다.
01 Oct 2008 2:16:22 PM sun.rmi.transport. customer .TCPTransport$AcceptLoop executeAcceptLoop
WARNING: RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=37278] throws
java.io.IOException: The server sockets created using the LocalRMIServerSocketFactory only accept connections from clients running on the host where the RMI remote objects have been exported.
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:89)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.run(TCPTransport.java:359)
at java.lang.Thread.run(Thread.java:636)
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672를 참조하십시오.
또한-Dcom.sun.management.jmxremote.authenticate=false
누구나 액세스 할 수 있도록주의하십시오 . 그러나 로컬 시스템에서 JVM을 추적하기 위해이 기능 만 사용하는 경우에는 문제가되지 않습니다.
업데이트 :
어떤 경우에는 서버에 연결할 수 없었습니다. 이 매개 변수를 설정하면이 문제가 해결되었습니다.-Djava.rmi.server.hostname=127.0.0.1
com.sun.management.jmxremote
기본값이 인 것이 이상합니다 true
. (당신에게 일을 감사합니다!) 슈퍼 명확하게하기 위해, JMX의 NOBS 덜 익숙한 사람들은, 내가 사용 특히에 : com.sun.management.jmxremote=true
참조 : docs.oracle.com/javase/8/docs/technotes/guides/management/...
Dcom.sun.management.jmxremote.rmi.port=9011
방화벽에서 추가 및 열려고 시도했지만 여전히 방화벽이 작동하는 상태에서 연결할 수 없습니다. 이견있는 사람? 내가 놓친 것이 있습니까?
Docker 컨테이너에서 실행하면 연결에 대한 추가 문제가 많이 발생하여 누군가에게 도움이되기를 바랍니다. 아래에서 설명 할 다음 옵션을 추가해야했습니다.
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${DOCKER_HOST_IP}
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9998
DOCKER_HOST_IP
jconsole을 로컬로 사용하는 것과 달리 컨테이너 내에서 볼 수있는 것과 다른 IP를 광고해야합니다. ${DOCKER_HOST_IP}
Docker 호스트의 외부에서 확인할 수있는 IP (DNS 이름) 로 바꿔야 합니다.
JMX 원격 및 RMI 포트
JMX는 다른 포트 를 사용 하여 연결을 중재 할 때 일부 데이터를 전송 하는 원격 관리 인터페이스 ( jstat )에 액세스해야하는 것처럼 보입니다 . 나는 이 가치를 설정하는 데 즉시 명백한 곳을 보지 못했습니다 . 링크 된 기사에서 프로세스는 다음과 같습니다.jconsole
jconsole
로깅이 활성화 된 상태 에서 시도 및 연결jconsole
를 사용하려고 했는지 파악iptables
/ firewall
규칙그것이 작동하는 동안, 그것은 자동화 가능한 솔루션이 아닙니다. jconsole에서 VisualVM으로 의 업그레이드를 선택했습니다 jstatd
. 실행중인 포트를 명시 적으로 지정할 수 있기 때문 입니다. VisualVM에서 새 원격 호스트를 추가하고 위에 지정된 값과 관련된 값으로 업데이트하십시오.
그런 다음 새 원격 호스트 연결을 마우스 오른쪽 버튼으로 클릭하고 Add JMX Connection...
확인란을 선택하는 것을 잊지 마십시오 Do not require SSL connection
. 바라건대, 그것은 당신이 연결할 수 있어야합니다.
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[...]
SSH를 통해 JMX / RMI를 터널링하는 경우에도 중요합니다. 이들이 없으면 원격 개체는 임의의 포트를 사용하여 서버의 공개 / 주 / ... IP를 사용하여 액세스 할 수 있습니다.이 포트는 쉽게 전달할 수 없습니다.
-Djava.rmi.server.hostname=0.0.0.0
DOCKER_HOST_IP
어디서나 - 그냥 사용 localhost
고정 표시기 이미지를 실행할 때 포트 및 전달 : -p 9998:9998, -p 9999:9999
등
최신 화신의 Java 6을 사용하면 JMX incantations없이 시작된 후에도 jconsole을 실행중인 프로세스에 연결할 수 있습니다.
사용 가능한 경우 jvisualvm은 프로파일 러를 포함하여 프로세스 실행에 대한 풍부한 정보를 제공하므로 jvisualvm도 고려하십시오.
WAS ND 7.0을 사용하고 있습니다
JConsole에서 JVM을 모니터링하려면 다음 인수가 모두 필요합니다.
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Linux에서는 다음과 같은 매개 변수를 사용했습니다.
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
또한 /etc/hosts
호스트 이름이 루프백 주소 (127.0.0.1)가 아닌 호스트 주소 (192.168.0.x)로 확인되도록 편집했습니다.
다음 명령 행 매개 변수를 사용하여 Java 애플리케이션을 실행하십시오.
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.ssl = false 를 사용하는 것이 중요합니다jmx 호스트에서 디지털 인증서를 설정하지 않으려면 매개 변수 합니다.
IP 주소가 192.168.0.1 인 시스템에서 애플리케이션을 시작한 경우 jconsole을 열고 원격 프로세스 필드 에 192.168.0.1:8855 를 입력 한 후 연결을 클릭 하십시오 .
-Dcom.sun.management.jmxremote.ssl=false
? jconsole
오류가 표시 되어야합니까 , 아니면 조용히 연결에 실패합니까?
아래 명령 줄 매개 변수와 함께
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
때로는 리눅스 서버에서 imx 연결이 성공하지 못합니다. 이는 클라우드 Linux 호스트에서 / etc / hosts에 있으므로 호스트 이름이 호스트 주소로 확인되기 때문입니다.
이를 해결하는 가장 좋은 방법은 네트워크의 다른 컴퓨터에서 특정 Linux 서버를 핑하고 해당 호스트 IP 주소를
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
그러나 ifconfig.me를 사용하여 Linux 서버에서 얻는 ipaddress에 의존하지 마십시오. 당신이 얻는 IP는 호스트 파일에 존재하는 마스크 된 것입니다.
먼저 Java 프로세스가 이미 JMX 매개 변수로 실행 중인지 확인해야합니다. 이 작업을 수행:
ps -ef | grep java
모니터링해야하는 Java 프로세스를 확인하십시오. jmx rmi 매개 변수 Djmx.rmi.registry.port = xxxx 를 볼 수있는 경우 여기에서 java visualvm에 언급 된 포트를 사용하여 jmx 연결에서 원격으로 연결하십시오.
jmx rmi 포트를 통해 실행되지 않으면 아래 언급 된 매개 변수로 Java 프로세스를 실행해야합니다.
-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
참고 : 포트 번호는 선택한 항목을 기준으로합니다.
이제이 포트를 jmx 연결에 사용할 수 있습니다. 여기는 port 1234
입니다.
sudo lsof -i:1234
나를 위해 아무것도 표시하지 않습니다
1 단계 : 다음 매개 변수를 사용하여 애플리케이션을 실행하십시오.
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
위의 인수는 응용 프로그램을 포트 9999에 바인딩합니다.
2 단계 : 명령 프롬프트 또는 터미널에서 jconsole 명령을 실행하여 jconsole을 시작하십시오.
'원격 프로세스 :'를 선택하고 URL을 {IP_Address} : 9999로 입력하고 연결 버튼을 클릭하여 원격 애플리케이션에 연결하십시오.
완전한 신청을 위해이 링크 를 참조 할 수 있습니다 .
나는이 정확한 문제가 있었고 올바른 설정을 테스트하고 알아내는 GitHub 프로젝트를 만들었습니다 .
Dockerfile
지원 스크립트 작업 과 docker-compose.yml
빠른 테스트를위한 간단한 작업이 포함되어 있습니다 .