2012-01-31 4 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」の部分を参照してください:IBMのVMを計測する前に 1、1、エージェントが存在するかどうかをテストする必要があります。 をつまり、// IBM の行の前にこのチェックを挿入します。if(null == connectorAddress) {(connectorAddress = vm.getSystemProperties()。getProperty( CONNECTOR_ADDRESS)); } 2. JMXConnectorFactoryから取得したコネクタ(JMXConnectorコネクタ...)は、mbeanが不要になったときに閉じる必要があります。この場合、コネクターは、後でconnector.close()を有効にするためにクラス内のメンバーでなければなりません。 –

関連する問題