jconsole로 액세스하기 위해 JVM에서 JMX를 활성화하는 방법은 무엇입니까?


223

jconsole로 액세스하기 위해 JVM에서 JMX를 활성화하는 방법은 무엇입니까?


32
그것은 항상 매개 변수를 복사 할 위치를 잊어 버렸으므로 이제는 나에게 상기시켜줍니다. :-)
Mauli

20
Stack Exchange는 항상 사용자가 자신의 질문에 대답하도록 독려했습니다. stackoverflow.com/help/self-answer
Tim Büthe

11
한 번 이상 나는 SO를 검색하여 무언가를 찾았습니다. 그리고 그 중 하나도 나에게 물었다. 그렇기 때문에 자신의 답을 입력하는 것이 좋습니다. 또한, 문제가 발생한 다른 모든 사람들을 생각하십시오. 질문에 대답하면 그들도 도울 것입니다.
Mike Miller

2
Java 8에 대한 업데이트 된 문서가 여기 있습니다
Andrew Johnston

@Mauren : 자신이 답변 한 비공개 질문에 대한 참조를 제공 할 수 있습니까? 메타에 대해 논의 해 볼 가치가 있습니다.
kevinarpe

답변:


290

관련 문서는 여기에서 찾을 수 있습니다.

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


9
-Dcom.sun.management.jmxremote.local.only = false는 현재 Centos에서도 필요합니다
LenW

1
Nit pick : com.sun.management.jmxremote기본값이 인 것이 이상합니다 true. (당신에게 일을 감사합니다!) 슈퍼 명확하게하기 위해, JMX의 NOBS 덜 익숙한 사람들은, 내가 사용 특히에 : com.sun.management.jmxremote=true참조 : docs.oracle.com/javase/8/docs/technotes/guides/management/...
kevinarpe

1
"-Djava.rmi.server.hostname"은 저에게 매력처럼 작용했습니다!
Orhun D.

1
SSH 터널을 통해 원격 서버에 연결하려는 경우 호스트 이름을 localhost로 설정하는 것이 매우 중요합니다.
Nikhil Owalekar

1
서버에서 방화벽을 비활성화 한 경우에만 작동합니다. 물론이 예제에서 포트 9010 / tcp를 열었고 Dcom.sun.management.jmxremote.rmi.port=9011방화벽에서 추가 및 열려고 시도했지만 여전히 방화벽이 작동하는 상태에서 연결할 수 없습니다. 이견있는 사람? 내가 놓친 것이 있습니까?
Carmageddon

70

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. 바라건대, 그것은 당신이 연결할 수 있어야합니다.


-Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.rmi.port=[...]SSH를 통해 JMX / RMI를 터널링하는 경우에도 중요합니다. 이들이 없으면 원격 개체는 임의의 포트를 사용하여 서버의 공개 / 주 / ... IP를 사용하여 액세스 할 수 있습니다.이 포트는 쉽게 전달할 수 없습니다.
Thorsten Schöning

1
컨테이너 대 외부 IP를 정말로 사용해야한다는 것을 확인할 수 있습니다. 예를 들어이 작동하지 않습니다-Djava.rmi.server.hostname=0.0.0.0
raisercostin

나는 사용하지 않았다 DOCKER_HOST_IP어디서나 - 그냥 사용 localhost고정 표시기 이미지를 실행할 때 포트 및 전달 : -p 9998:9998, -p 9999:9999
바니

9

최신 화신의 Java 6을 사용하면 JMX incantations없이 시작된 후에도 jconsole을 실행중인 프로세스에 연결할 수 있습니다.

사용 가능한 경우 jvisualvm은 프로파일 러를 포함하여 프로세스 실행에 대한 풍부한 정보를 제공하므로 jvisualvm도 고려하십시오.


3
모니터링하려는 JVM과 동일한 호스트에서 jconsole을 실행중인 경우에만 작동합니다.
Gray

1
@ Thorbjorn 매개 변수없이 Java 프로그램을 시작하고 jconsole과 연결하려고하면 목록에 내 프로그램이 표시되지만 연결하려고하면 실패합니다. SSL 인증서가 없기 때문이라고 생각합니다. 나는 데모를보고 싶었으므로 user3013578에 의해 답변에 지정된 매개 변수를 사용해야했고 그것은 나를 위해 일했다 (JDK 1.7, Windows 8.1, 64 비트).
잭 스패로우 선장

2
연결 API를 사용하려면 jconsole에 일부 플랫폼에서 시작된 프로그램과 동일한 32/64 비트 JVM이 있어야합니다.
Thorbjørn Ravn Andersen

1
이 동작을 비활성화 할 수 있습니까?
kevinarpe

7

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

네 대답은 저에게 효과적이었습니다 (JDK 1.7, Windows 8.1 64 비트)
잭 스패로우 선장

6

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)로 확인되도록 편집했습니다.


2

다음 명령 행 매개 변수를 사용하여 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오류가 표시 되어야합니까 , 아니면 조용히 연결에 실패합니까?
amacleod

2

아래 명령 줄 매개 변수와 함께

-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는 호스트 파일에 존재하는 마스크 된 것입니다.


1

먼저 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입니다.


일단 이것을 실행하면 jmx가 포트 1234를 사용하고 있는지 볼 수 있습니까? sudo lsof -i:1234나를 위해 아무것도 표시하지 않습니다
Gorgon_Union

1

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로 입력하고 연결 버튼을 클릭하여 원격 애플리케이션에 연결하십시오.

완전한 신청을 위해이 링크 를 참조 할 수 있습니다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.