【问题标题】:Attaching to the J9VM using the Attach API使用 Attach API 附加到 J9VM
【发布时间】:2012-02-23 07:15:43
【问题描述】:

使用 Java Attach API 连接到 IBM 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

有人知道这样做的正确方法是什么吗?

【问题讨论】:

    标签: java j9


    【解决方案1】:

    看里面的“//IBM”部分

         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");
    
    }
    

    【讨论】:

    • 一些代码中的错误: 1. 在检测 IBM vm 之前,必须测试代理的存在:即在标有 //IBM if( null==connectorAddress) { (connectorAddress = vm.getSystemProperties().getProperty(CONNECTOR_ADDRESS)); 2. 当不再需要mbean 时,必须关闭从JMXConnectorFactory 检索到的连接器(JMXConnector 连接器...)。所以在这种情况下,连接器应该是类中的成员,以便稍后启用 connector.close()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2018-03-21
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多