2012-02-17 2 views
1

우리는 다양한 Java 응용 프로그램을 개발하기 위해 원격 Linux 상자를 공유하며, 우리는 ssh를 통해 VisualVM을 사용하여 as described here 응용 프로그램을 프로파일 링합니다. 프로세스/사용자간에 포트 번호를 할당/프로비저닝 할 필요없이 Java 프로세스에서 JMX/프로파일 링을 사용할 수있는 방법이 있습니까? 프로파일 링을 활성화하기 위해 (고유 한) 포트 번호를 지정하는지 항상 확인해야하는 것은 귀찮습니다. 원격으로 VisualVM을 사용하려면 jmxremote 포트를 설정하지 않아도됩니까?

이 모든보다 구체적인 만들려면 : 포트가 분명히 작동하지 않는 하드 코딩과 충돌합니다

exec java -Dcom.sun.management.jmxremote.port=3000 ... 

우리는 당신이 프로세스를 실행할 때마다 항상 고유 한 포트를 지정 요구할 수 있지만, 이것은 tedious--입니다 - 당신은 다른 프로세스와 충돌하지 않는 당신의 포트를 확인해야하고 다른 사용자와 충돌하지 않는 :

exec java -Dcom.sun.management.jmxremote.port=$1 ... 

는 현재 우리가 사용

exec java -Dcom.sun.management.jmxremote.port=$(($RANDOM + 2000)) ... 

하지만 우리는 여전히 점령 된 포트 번호에 때때로 충돌합니다.

더 복잡한 스크립트를 계속 사용할 수 있습니다 (예 : 점령 포트 번호에 대해 netstat을 쿼리하고 인종이 없기를 바랄 수 있음).하지만 더 나은 방법이 있는지/우리가 잘못하고 있는지 궁금해합니다.

답변

0

내 추측은 거기 -Dcom.sun.management.jmxremote.port=3000 ...없이 VM을 시작하는 방법입니다하지만 태양 JVM가 보인다 경우 다음

http://www.docjar.com/html/api/sun/management/jmxremote/ConnectorBootstrap.java.html

장소입니다 자신의 MBeanServer 커넥터를 시작하면 당신은 파악해야한다는 것입니다 전달 된 시스템 속성을 기반으로 커넥터를 시작하면 자신의 MBeanServerConnector를 시작할 수있을만큼 충분한 정보를 제공 할 것이라고 생각합니다.

http://docs.oracle.com/javase/1.5.0/docs/api/javax/management/remote/JMXConnectorServerFactory.html

newJMXConnectorServer에 전달 된 환경 변수는 JDK에서 코드를 읽는 경우 맵에 무엇을 넣을 지 발견 할 수 있으므로 자신의 코드로 커넥터를 시작할 수 있습니다. 사용 가능한 포트 번호를 선택하기 위해 자신의 Java 코드를 작성하십시오. 이 방법을 시도하지는 않았지만 유망한 것으로 보였고 나는 제기 한 질문에 대한 답변을 정말로 원합니다.

JMXConnectorServer connServer = null; 
    735   try { 
    736    connServer = 
    737      JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs); 
    738    connServer.start(); 
    739   } catch (IOException e) { 
    740    if (connServer == null) { 
    741     throw new AgentConfigurationError(CONNECTOR_SERVER_IO_ERROR, 
    742       e, url.toString()); 
    743    } else { 
    744     throw new AgentConfigurationError(CONNECTOR_SERVER_IO_ERROR, 
    745       e, connServer.getAddress().toString()); 
    746    } 
    747   } 
+0

Java 응용 프로그램에서 서버를 시작하지 않으면 문제가 한 번만 아래로 푸시됩니까? 포트 찾기가 더 강력해질 수 있습니다 (하나 이상의 포트를 시도 할 수 있고 TOCTTOU 레이스가 없을 수도 있기 때문에). 그러나이 작업을 우리가 작업하고있는 모든 프로젝트에 추가하지 않아도됩니다. . 어쨌든이 문제를 해결할 수있는 무언가가 있기를 바랍니다. – Yang

0

하나의 가능한 솔루션은 원격 상자에서 VisualVM을 실행하고 vnc 또는 원격 X 세션을 사용하여 로컬 컴퓨터에 VisualVM을 표시하는 것입니다.

관련 문제