2012-01-31 84 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