[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...

JMX 연결 추가

확인란을 선택하는 것을 잊지 마십시오 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는 호스트 파일에 존재하는 마스크 된 것입니다.