[java] 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
답변
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
. 바라건대, 그것은 당신이 연결할 수 있어야합니다.
답변
최신 화신의 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.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는 호스트 파일에 존재하는 마스크 된 것입니다.