2012-01-31 33 views
1

使用Java Attach API連接到IBM J9VM的正確方法是什麼?使用Attach API連接到J9VM

我想以下(與具有JDK在我的類路徑中的tools.jar):

private static final J9AttachProvider ATTACH_PROVIDER = new J9AttachProvider(); 


...snip... 
     String pid = getPIDofRunningVM(); 
     Constructor<J9VirtualMachine> constructor = J9VirtualMachine.class.getConstructor(new Class[]{AttachProvider.class, String.class 
       }); 
     constructor.setAccessible(true); 
     J9VirtualMachine virtualMachine = constructor.newInstance(new Object[]{ATTACH_PROVIDER, pid}); 

我也試過這樣做,而無需使用反射,但我不斷收到

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:44) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:516) 
    at de.test.Test.gogo(Test.java:34) 
    at de.teset.Test.main(Test.java:26) 
Caused by: java.lang.IllegalAccessError 
    at ibm.tools.attach.J9VirtualMachine.<init>(J9VirtualMachine.java:24) 
    ... 6 more 

有沒有人知道這樣做的正確方法是什麼?

回答

2

看到裏面

 private static final String CONNECTOR_ADDRESS = 
    "com.sun.management.jmxremote.localConnectorAddress"; 

void retrieveSomeMXBean (String pid) throws Exception { 
    com.sun.tools.attach.VirtualMachine vm = 
      com.sun.tools.attach.VirtualMachine 
      .attach(pid); 
    String connectorAddress = vm.getAgentProperties().getProperty(
      CONNECTOR_ADDRESS); 


    if (connectorAddress == null) { 
     String agent = vm.getSystemProperties().getProperty("java.home") 
       + File.separator + "lib" + File.separator 
       + "management-agent.jar"; 
     vm.loadAgent(agent); 

     connectorAddress = vm.getAgentProperties().getProperty(
       CONNECTOR_ADDRESS); 
    } 

    // IBM 
    if (connectorAddress == null) { 

     String agent = "instrument," 
       + vm.getSystemProperties().getProperty("java.home") 
       + File.separator + "lib" + File.separator 
       + "management-agent.jar="; 
     vm.loadAgentLibrary(agent); 

     connectorAddress = vm.getSystemProperties().getProperty(
       CONNECTOR_ADDRESS); 
    } 

    JMXServiceURL url = new JMXServiceURL(connectorAddress); 
    JMXConnector connector = JMXConnectorFactory.connect(url); 
    mbeanConn = connector.getMBeanServerConnection(); 

    memoryMXBean = new ObjectName("java.lang:type=Memory"); 

} 
+0

的「// IBM」部分逃脫到代碼的bug夫婦的: 1.插裝IBM VM之前,必須測試劑的存在: (插入地址= vm.getSystemProperties()。getProperty( CONNECTOR_ADDRESS));如果(空==連接器地址) } 2.當不再需要mbean時,必須關閉從JMXConnectorFactory檢索到的連接器(JMXConnector連接器...)。所以在這種情況下,連接器應該是該類中的成員,以便稍後啓用connector.close()。 – 2012-11-22 17:28:56