【JAVA教程】如何用JMX连接本地JVM上运行的Java程序-潭州JAVA

需解决的问题:

想开发一个JMX的客户端来配置一个本地Java程序。具体要求如下:

请不要推荐使用JConsole!JConsole不合适,因为JConsole是一个通用的JMX客户端,对主程序的性能存在负面影响。

Oracle网站上有一个使用RMIConnector和“主机 : 端口号”为参数的例子,但是我不知道在什么地方设置JMX的端口号?

JConsole可以选择PID来连接Java进程。但是在JMX的API中,我找不到任何方法是使用PID作为参数的。

解答:

我们使用一些类似下面的程序来连接JMX服务器。不过,需要在运行服务器时指定以下参数:

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.port=1234

-Dcom.sun.management.jmxremote.ssl=false

为了绑定特定地址,你需要在增加下面的VM参数:

1-Djava.rmi.server.hostname=A.B.C.D

这样,你就可以像下面的JMX客户端代码一样连接你的服务器了:

String host = "localhost";  // or some A.B.C.D

int port = 1234;

String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";

JMXServiceURL serviceUrl = new JMXServiceURL(url);

JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);

try {

MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection();

// now query to get the beans or whatever

Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);

...

} finally {

jmxConnector.close();

}

我们也可以不使用VM参数,代码本身可以通过编程在指定端口号发布。但是我想这个已经比你的需求更复杂了。

如果要根据PID来连接,据我现在所知,你需要使用Java 6以上的版本。我没使用过下面的代码,但是看起是可以正常工作的:

List<VirtualMachineDescriptor> vms = VirtualMachine.list();

for (VirtualMachineDescriptor desc : vms) {

VirtualMachine vm;

try {

vm = VirtualMachine.attach(desc);

} catch (AttachNotSupportedException e) {

continue;

}

Properties props = vm.getAgentProperties();

String connectorAddress =

props.getProperty("com.sun.management.jmxremote.localConnectorAddress");

if (connectorAddress == null) {

continue;

}

JMXServiceURL url = new JMXServiceURL(connectorAddress);

JMXConnector connector = JMXConnectorFactory.connect(url);

try {

MBeanServerConnection mbeanConn = connector.getMBeanServerConnection();

Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);

...

} finally {

jmxConnector.close();

}

}

我已发布过一个新的SimpleJMX包,该包能帮助很简单的启动一个JMX服务,并向远程客户端发送beans。

//创建一个新的服务器并监听8000端口

JmxServer jmxServer = new JmxServer(8000);

//启动服务器

jmxServer.start();

//注册下面定义的lookupCache对象

jmxServer.register(lookupCache);

jmxServer.register(someOtherObject);

//停止服务

jmxServer.stop();

该包确实有一个客户端的接口,但是当前没有人一种机制是可以通过PID来查找进程的,只支持主机/端口的组合方式查找。

PS:如有什么问题,请直接在群457036818提出。

时间: 2025-01-04 07:17:19

【JAVA教程】如何用JMX连接本地JVM上运行的Java程序-潭州JAVA的相关文章

如何用命令将本地项目上传到github

一.Git终端软件安装 1.下载windows上git终端,类似shell工具,下载地址:http://msysgit.github.io/ 2.安装方法,打开文件,一路点击Next即可 3.安装完成,界面如下 二.配置 1.打开git bash,输入ssh-keygen -t rsa -C "自己的邮箱地址@XXX.com" ,生成自己的公钥与私钥 2.一路默认回车,会生成公钥.私钥到以下文件夹下id_rsa是私钥,id_rsa.pub是公钥,打开公钥等下要用到 3.浏览器进入自己的

利用java.io.File类实现遍历本地磁盘上指定盘符或文件夹的所有的文件

2016-11-18 这是本人的第一篇随笔博客,纠结了半天还是选择自己学的时候比较用心的一些知识点上.利用java.io.File类指定本地的文件夹进行遍历所有的文件. package org.lxm.filedemo; import java.io.File; import java.util.Scanner; /* * 本程序是将某个盘的所有文件夹及其文件全部调出来的操作 */ public class FileAllDemo { public static void main(String

使用Xshell连接本地VMware上的Linux虚拟机

1.检查Linux虚拟机的网络连接模式,确保它是NAT模式. 2.在VMware workstation里,点击菜单栏上的[编辑]-->[虚拟网络编辑器],选择VMnet8(NAT模式),取消勾选[适用本地DHCP服务将IP地址分配给虚拟机] 3.点击NAT设置(s)... 如上图所示,虚拟机所在的网段为192.168.164.0,网关为192.168.164.2 4.设置虚拟机Linux系统中的IP地址 其中IP地址要在192.168.164.0这个网段内,且不能和网关及广播地址冲突 设置完后

如何用命令将本地项目上传到git

1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点".",意为添加文件夹下的所有文件 git add . 3.用命令 git commit告诉Git,把文件提交到仓库.引号内为提交说明 git commit -m 'first commit' 4.关联到远程库 git remote add origin 你的远程库地址 如: git re

如何用命令将本地项目上传到git和ssh配置

嘛,就是将服务器上的网站和本地同步.首先是上传服务器上的网站到github仓库git initgit add .git commit -m ''关联远程仓库,先去github上新建一个,new repositorygit remote add origin 你的远程库地址同步 合并git pull --rebase origin master推送git push -u origin master克隆git clone [email protected]:jaxma/pig.git pig ssh

如何用navicat连接linux服务器上的mysql

1,开启mysql权限:https://www.cnblogs.com/NaughtyCat/p/how-to-connect-to-mysql-on-linux-by-navicat.html mysql开启root权限(mysql命令下执行) 赋予权限:   grant all privileges on *.* to 'root'@'% 'identified by 'your password' with  grant option 刷新权限列表:   flush privileges

如何在本地机器上运行项目

如何在本地运行公司的项目?公司的项目种类比较多,不同的项目使用不同的方法,但是都是大同小异的. 如何运行marketsbarometer这个项目? Clone the project :git clone https://[email protected]/scm/qs/markets-components-barometer.git Change directory into the project dir:  cd markets-components-barometer 3.  Run n

浅析Java的jvm上的内存位置的分配

浅析Java的jvm上的内存位置的分配 1.Java的内存区域简介 1>程序计数器: 一小块的内存空间,每个线程都有一个独立的计数器,线程私有;作用:作为当前线程代码行行号指示器,这个值可以选取下一条需要执行的字节码指令,例如分支,循环等,每创建一根线程会相应的产生一个程序计数器 2>栈 线程私有,用于存放局部变量,保存基本数据类型的值,操作数栈(保存着计算过程的中间结果),动态链接,方法入口和出口等信息:局部变量表中保存着函数的参数和局部变量,当调用结束以后,栈帧销毁,局部变量表也随之销毁

牛逼了,教你用九种语言在JVM上输出HelloWorld

我们在<深入分析Java的编译原理>中提到过,为了让Java语言具有良好的跨平台能力,Java独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode). 有了字节码,无论是哪种平台(如Windows.Linux等),只要安装了虚拟机,都可以直接运行字节码. 同样,有了字节码,也解除了Java虚拟机和Java语言之间的耦合.这话可能很多人不理解,Java虚拟机不就是运行Java语言的么?这种解耦指的是什么? 其实,目前Java虚拟机已经可以支持很多除Java语言以