首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何连接到另一个本地进程中的mBeanServer?

如何连接到另一个本地进程中的mBeanServer?
EN

Stack Overflow用户
提问于 2010-12-31 04:00:45
回答 2查看 5.9K关注 0票数 4

如果在启动JVM时设置了"com.sun.management.jmxremote“系统属性,则可以运行jconsole或visualvm并连接到本地mBeanServer。我想做他们正在做的同样的事情,但不知道怎么做。

有没有可以用来标识本地运行的JVM的服务URL?

我知道我可以通过在特定端口上设置jmxmp或rmi侦听器,然后连接到该端口来做到这一点,但我不想这样做,因为这意味着我必须管理端口并知道哪个端口连接到哪个jvm (我们在同一服务器上运行多个jvm)。

EN

回答 2

Stack Overflow用户

发布于 2012-10-29 14:59:23

感谢Nicholas和Scott的帖子和讨论。能够根据这些信息和一些试验和错误将其拼凑在一起。

共享,这样其他人就不必做同样的腿上工作了。这将附加到JVM并获取其内存使用情况。

代码语言:javascript
复制
import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;
import com.sun.tools.attach.spi.AttachProvider;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class AttachFun {

    public static void main(String[] args) throws Exception {
        final AttachProvider attachProvider = AttachProvider.providers().get(0);

        VirtualMachineDescriptor descriptor = null;
        for (VirtualMachineDescriptor virtualMachineDescriptor : attachProvider.listVirtualMachines()) {
            if (pickThisOne(virtualMachineDescriptor)) {
                descriptor = virtualMachineDescriptor;
                break;
            }
        }

        if (descriptor == null) throw new RuntimeException("You didn't pick one");

        final VirtualMachine virtualMachine = attachProvider.attachVirtualMachine(descriptor);
        virtualMachine.loadAgent("/System/Library/Frameworks/JavaVM.framework/Home/lib/management-agent.jar", "com.sun.management.jmxremote");
        final Object portObject = virtualMachine.getAgentProperties().get("com.sun.management.jmxremote.localConnectorAddress");

        final JMXServiceURL target = new JMXServiceURL(portObject + "");
        final JMXConnector connector = JMXConnectorFactory.connect(target);
        final MBeanServerConnection remote = connector.getMBeanServerConnection();

        final ObjectName memory = new ObjectName("java.lang:type=Memory");
        CompositeData cd = (CompositeData) remote.getAttribute(memory, "HeapMemoryUsage");

        final Long used = (Long) cd.get("used");
        System.out.println(used);

    }

    private static boolean pickThisOne(VirtualMachineDescriptor virtualMachineDescriptor) {
        // TODO
        return false;
    }
}
票数 7
EN

Stack Overflow用户

发布于 2010-12-31 18:39:19

你需要Attach API。它将在同一主机上定位正在运行的支持Attach API的JVM,并在每个主机上返回元数据,同时启用JMXConnector。这基本上就是您在启动JMX时看到的,connect菜单显示正在运行的JConsole,包括没有使用任何特殊的1.6+命令行指令启动的JVM实例。

//Nicholas

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4565827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档