查找本地进程的jmx url的代码

好久没写blog了,先来篇充充数。。

当想用JMX连接本地进程,而这个进程又没有配置JMX相关的参数,怎样才能连到这个进程?

下面的代码是从ActiveMQ的代码里抠出来的,可以得到本地进程的jmx url。

不过当目标进程配置了-Djava.io.tmpdir 参数时,不能正常工作,原因是JDK的bug。

参考:

http://dikar.iteye.com/blog/1415408

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6649594

所以ActiveMQ5.8在用命令行时,用 "./activemq-admin list" ,得不出结果,改用"./activemq
list "就可以了。

原因是"activemq-admin"这个脚本里,配置了一个java.io.tmpdir 的参数。

给ActiveMQ提了个issue,不过貌似没人理。。

https://issues.apache.org/jira/browse/AMQ-4541

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
import java.util.Properties;

public class AbstractJmxCommand  {
    private static final String CONNECTOR_ADDRESS =
        "com.sun.management.jmxremote.localConnectorAddress";

    public static String getJVM() {
        return System.getProperty("java.vm.specification.vendor");
    }

    public static boolean isSunJVM() {
        // need to check for Oracle as that is the name for Java7 onwards.
        return getJVM().equals("Sun Microsystems Inc.") || getJVM().startsWith("Oracle");
    }

    /**
     * Finds the JMX Url for a VM by its process id
     *
     * @param pid
     * 		The process id value of the VM to search for.
     *
     * @return the JMX Url of the VM with the given pid or null if not found.
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    protected String findJMXUrlByProcessId(int pid) {

        if (isSunJVM()) {
            try {
                // Classes are all dynamically loaded, since they are specific to Sun VM
                // if it fails for any reason default jmx url will be used

                // tools.jar are not always included used by default class loader, so we
                // will try to use custom loader that will try to load tools.jar

                String javaHome = System.getProperty("java.home");
                String tools = javaHome + File.separator +
                        ".." + File.separator + "lib" + File.separator + "tools.jar";
                URLClassLoader loader = new URLClassLoader(new URL[]{new File(tools).toURI().toURL()});

                Class virtualMachine = Class.forName("com.sun.tools.attach.VirtualMachine", true, loader);
                Class virtualMachineDescriptor = Class.forName("com.sun.tools.attach.VirtualMachineDescriptor", true, loader);

                Method getVMList = virtualMachine.getMethod("list", (Class[])null);
                Method attachToVM = virtualMachine.getMethod("attach", String.class);
                Method getAgentProperties = virtualMachine.getMethod("getAgentProperties", (Class[])null);
                Method getVMId = virtualMachineDescriptor.getMethod("id",  (Class[])null);

                List allVMs = (List)getVMList.invoke(null, (Object[])null);

                for(Object vmInstance : allVMs) {
                    String id = (String)getVMId.invoke(vmInstance, (Object[])null);
                    if (id.equals(Integer.toString(pid))) {

                        Object vm = attachToVM.invoke(null, id);

                        Properties agentProperties = (Properties)getAgentProperties.invoke(vm, (Object[])null);
                        String connectorAddress = agentProperties.getProperty(CONNECTOR_ADDRESS);

                        if (connectorAddress != null) {
                            return connectorAddress;
                        } else {
                            break;
                        }
                    }
                }
            } catch (Exception ignore) {
            }
        }

        return null;
    }
}
时间: 2024-12-02 10:02:48

查找本地进程的jmx url的代码的相关文章

不用重新配置,用jconsole连接远程机器进程及获得本地进程的JMX Url的终极办法

估计有很多人都在想用jconsole连接远程机器上的进程时,发现没有配置jmx端口,或者其它的东东. 下面介始一种很简单的办法,可以不用重启远程机器的进程: ssh -X  192.168.66.66  -l username 连接上去之后,可以直接运行jconsole进程,然后在本机就会弹出一个jconsole的窗口了. 实际上这个不是用jconsole连接远程机器的进程,而是把远程机器上的X输出转地本地来. 如果有提示失败,那么可能要配置下ssh可以转发X. ================

c++写一个循环来查找指定进程 不知道该怎么写?求代码

问题描述 c++写一个循环来查找指定进程 不知道该怎么写?求代码 c++写一个循环来查找指定进程 不知道该怎么写?求代码 网上找了不少资料单老是编译出错 求大神指点 解决方案 用CreateToolhelp32Snapshot 参考:http://blog.csdn.net/zhongbin104/article/details/7867309 解决方案二: BOOL FindProcessByName(LPCTSTR szFileName, PROCESSENTRY32& pe) { // 采

JS本地刷新返回上一页代码_javascript技巧

长话短说,今天介绍实现此功能的一个方法,需要了解的朋友可以参考下: 一.JS 重载页面,本地刷新,返回上一页 代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a href="javascript:location.reload()">重载页面,本地刷新</a> <a href="javascript:history.go(-1);location

查找ip地址、查找本地IP、网络IP和对方IP地址的方法

查找本地IP地址针对的是在使用路由器或者交换机等局域网内的用户,最常见的是多人通过路由器共享上网,对于这种情况查找本地IP地址非常简单,首先进入桌面,从左下角的开始里找到运行,在运行对话框中输入cmd命令,然后再CMD命令框中输入 ipconfig /all 再按回车键即可超找到本地IP地址; 网络IP地址是指我们连接上互联网中的IP地址,这个IP地址在全球都是唯一的,IP地址也是由地方与区域决定的,也是用户所无法修改的,由网络商提供,相当于一个家庭的住址,查看网络IP地址的方法很简单,详情如下

php 匹配url 正则表达式代码

php教程 匹配url 正则表达式代码 //这是个获取文章内容中所有链接的php正则表达式 $str =""; $reg = "<a[sS]*?(href)s*=s*(?(?=["'])((["'])(?<href>[^"']*)2)|(?<src>[^s>]+))[sS]*?>";//下面这个实例是获取内容中域名正则表达式 function get_domain($url){   $patte

快照-vc++编写查找指定进程的程序

问题描述 vc++编写查找指定进程的程序 百度了几个大同小异的例子 编译后出现了一堆错误 求大神指点 以下是其中一个例子BOOL FindProcessByName(LPCTSTR szFileName, PROCESSENTRY32& pe) { // 采用进程快照枚举进程的方法查找指定名称进程 HANDLE hProcesses; PROCESSENTRY32 lpe = { sizeof(PROCESSENTRY32) }; CString strFileName(szFileName);

C#获取当前页面的URL示例代码_实用技巧

本实例的测试URL:http://www.mystudy.cn/web/index.aspx 1.通过C#获取当前页面的URL 复制代码 代码如下: string url = Request.Url.AbsoluteUri; //结果: http://www.mystudy.cn/web/index.aspx string host = Request.Url.Host; //结果:www.mystudy.cn string rawUrl = Request.RawUrl; //结果:/web/

求大神给一段采集URL的代码吧

问题描述 求大神给一段采集URL的代码吧我只需要采集各种URL就可以了希望大神能给出代码并说一下怎么使用呢 解决方案 解决方案二:http://www.2cto.com/kf/201106/93983.html解决方案三://第三个:截取网址publicstaticArrayListGetUrl(stringcode,stringwordsBegin,stringwordsEnd){ArrayListurlList=newArrayList();//stringNewsTitle=""

asp.net 获取url参数值代码

asp教程.net 获取url参数值代码 file: default.aspx.cs using system; using system.data; using system.configuration; using system.collections; using system.web; using system.web.security; using system.web.ui; using system.web.ui.webcontrols; using system.web.ui.w