JMX客户端及对commons-pool的监控
【摘要】 本文转自JMX客户端及对commons-pool的监控
本文对原文进行梳理,梳理出一条使用JMX客户端对commons-pool监控的简单使用指南。
生产线上,我们的服务基本都是在linux环境下部署的,当高并发的时候,机器的负载是比较高的,所以我们只能在linux机器上执行一些简单的命令行工具,如jps,jstack,jinfo等,像...
本文对原文进行梳理,梳理出一条使用JMX客户端对commons-pool监控的简单使用指南。
生产线上,我们的服务基本都是在linux环境下部署的,当高并发的时候,机器的负载是比较高的,所以我们只能在linux机器上执行一些简单的命令行工具,如jps,jstack,jinfo等,像重量级的jconsole,jvisualvm这些首先需要桌面环境才能观看,服务器肯定是没有开启X client的,所以只能通过jmx在远程客户端观看,但这种情况下,势必会对本机造成一些不必要的资源占用,如网络带宽等。但是想mbean这些对象的监控目前又只能通过jconsole,jvisualvm这些jmx客户端访问,想要在本机以命令行的方式查看还是比较困难的。本文的目的就是介绍下怎么在linux服务器下以命令下的方式进行jmx监控。
1、代码
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;
public class JmxC {
public static void main(String[] args) {
if (args.length > 0) {
if (args[0].equals("-l")) {
JmxC c = new JmxC();
c.m1();
} else if (args[0].equals("-p")) {
int id = Integer.valueOf(args[1]);
System.out.println("pid:" + id);
JmxC c = new JmxC();
if (args.length > 2 && args[2].equals("-n")) {
String name = args[3];
System.out.println("args name:" + name);
if (args.length > 4 && args[4].equals("-a")) {
String atts = args[5];
System.out.println("args atts:" + name);
c.processMbean(c.getConnectStrById(id), name, atts);
} else {
c.processMbean(c.getConnectStrById(id), name, null);
}
} else {
c.processMbean(c.getConnectStrById(id));
}
}
}
}
public void processMbean(String connectorAddress, String name, String att) {
if (null == connectorAddress)
return;
JMXConnector connector = null;
try {
System.out.println("conn:" + connectorAddress);
JMXServiceURL url = new JMXServiceURL(connectorAddress);
connector = JMXConnectorFactory.connect(url);
MBeanServerConnection mbeanConn = connector
.getMBeanServerConnection();
Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
System.out.println("beanSet num:" + beanSet.size());
ObjectName n = new ObjectName(name);
MBeanInfo info = mbeanConn.getMBeanInfo(n);
if (null != info) {
if (null != att && !att.isEmpty()) {
String[] as = att.split(",");
List<String> al = new LinkedList<String>();
System.out.print(" time " + "\t");
for (String a : as) {
if (null != a && !a.isEmpty()) {
al.add(a);
System.out.print(a + "\t");
}
}
System.out.println();
SimpleDateFormat dateformat1 = new SimpleDateFormat(
"HH:mm:ss");
while (true) {
System.out.print(dateformat1.format(new Date()) + "\t");
for (String a : al) {
Object value = null;
if (!a.contains("-")) {
value = mbeanConn.getAttribute(n, a);
} else {
String[] at = a.split("-");
value = (long) mbeanConn.getAttribute(n, at[0])
- (long) mbeanConn.getAttribute(n,
at[1]);
}
System.out.print(value + "\t");
}
System.out.println();
Thread.sleep(1000);
}
} else {
MBeanAttributeInfo[] atts = info.getAttributes();
for (MBeanAttributeInfo attr : atts) {
Object value = mbeanConn
.getAttribute(n, attr.getName());
System.out.println(attr.getName() + "->" + value);
}
}
} else {
System.err.println("info is null");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (connector != null)
connector.close();
// break;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// ...
}
public void processMbean(String connectorAddress) {
if (null == connectorAddress)
return;
JMXConnector connector = null;
try {
System.out.println("conn:" + connectorAddress);
JMXServiceURL url = new JMXServiceURL(connectorAddress);
connector = JMXConnectorFactory.connect(url);
MBeanServerConnection mbeanConn = connector
.getMBeanServerConnection();
Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
System.out.println("beanSet num:" + beanSet.size());
for (ObjectName name : beanSet) {
if (name.getDomain().equals("org.apache.commons.pool2")) {
System.out.println("name:" + name);
// ObjectInstance instance =
// mbeanConn.getObjectInstance(name);
MBeanInfo info = mbeanConn.getMBeanInfo(name);
MBeanAttributeInfo[] atts = info.getAttributes();
for (MBeanAttributeInfo attr : atts) {
Object value = mbeanConn.getAttribute(name,
attr.getName());
System.out.println(attr.getName() + "->" + value);
}
System.out.println();
System.out.println();
System.out.println();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (connector != null)
connector.close();
// break;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// ...
}
public String getConnectStrById(int pid) {
List<VirtualMachineDescriptor> vms = VirtualMachine.list();
int i = 0;
for (VirtualMachineDescriptor desc : vms) {
if (!desc.id().equals("" + pid)) {
continue;
}
VirtualMachine vm;
try {
System.out.println("desc:" + desc);
System.out.println("process id:" + desc.id());
vm = VirtualMachine.attach(desc);
} catch (Exception e) {
e.printStackTrace();
continue;
}
try {
Properties props = vm.getAgentProperties();
System.out.println("args:" + props.get("sun.jvm.args"));
for (Map.Entry<Object, Object> entry : props.entrySet()) {
// System.out.println(entry.getKey() + "->" +
// entry.getValue());
}
String connectorAddress = props
.getProperty("com.sun.management.jmxremote.localConnectorAddress");
if (connectorAddress == null) {
System.out
.println("connectorAddress is null,and continue search");
props = vm.getSystemProperties();
String home = props.getProperty("java.home");
// Normally in ${java.home}/jre/lib/management-agent.jar but
// might
// be in ${java.home}/lib in build environments.
String agent = home + File.separator + "jre"
+ File.separator + "lib" + File.separator
+ "management-agent.jar";
File f = new File(agent);
if (!f.exists()) {
agent = home + File.separator + "lib" + File.separator
+ "management-agent.jar";
f = new File(agent);
if (!f.exists()) {
throw new IOException("Management agent not found");
}
}
agent = f.getCanonicalPath();
vm.loadAgent(agent, "com.sun.management.jmxremote");
props = vm.getAgentProperties();
connectorAddress = props
.getProperty("com.sun.management.jmxremote.localConnectorAddress");
if (connectorAddress == null) {
System.out.println("connectorAddress is null");
}
}
return connectorAddress;
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("return null");
return null;
}
public void m1() {
List<VirtualMachineDescriptor> vms = VirtualMachine.list();
int i = 0;
for (VirtualMachineDescriptor desc : vms) {
System.out.println();
System.out.println();
System.out.println("------" + i++ + "----------------");
VirtualMachine vm;
try {
System.out.println("desc:" + desc);
System.out.println("process id:" + desc.id());
vm = VirtualMachine.attach(desc);
} catch (Exception e) {
e.printStackTrace();
continue;
}
JMXConnector connector = null;
try {
Properties props = vm.getAgentProperties();
System.out.println(props.get("sun.jvm.args"));
for (Map.Entry<Object, Object> entry : props.entrySet()) {
// System.out.println(entry.getKey() + "->" +
// entry.getValue());
}
String connectorAddress = props
.getProperty("com.sun.management.jmxremote.localConnectorAddress");
if (connectorAddress == null) {
System.out
.println("connectorAddress is null,and continue search");
props = vm.getSystemProperties();
String home = props.getProperty("java.home");
// Normally in ${java.home}/jre/lib/management-agent.jar but
// might
// be in ${java.home}/lib in build environments.
String agent = home + File.separator + "jre"
+ File.separator + "lib" + File.separator
+ "management-agent.jar";
File f = new File(agent);
if (!f.exists()) {
agent = home + File.separator + "lib" + File.separator
+ "management-agent.jar";
f = new File(agent);
if (!f.exists()) {
throw new IOException("Management agent not found");
}
}
agent = f.getCanonicalPath();
vm.loadAgent(agent, "com.sun.management.jmxremote");
props = vm.getAgentProperties();
connectorAddress = props
.getProperty("com.sun.management.jmxremote.localConnectorAddress");
if (connectorAddress == null) {
System.out.println("connectorAddress is null");
continue;
}
}
System.out.println("conn:" + connectorAddress);
JMXServiceURL url = new JMXServiceURL(connectorAddress);
connector = JMXConnectorFactory.connect(url);
MBeanServerConnection mbeanConn = connector
.getMBeanServerConnection();
Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
System.out.println("beanSet num:" + beanSet.size());
// ...
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (connector != null)
connector.close();
// break;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
将上述代码编译,如果使用javac命令编译出错的话,建议先拷贝到eclipse,然后直接拿到编译后的.class文件。
2、使用上述工具来监控commons-pool
1)首先我们将编译后的class文件存放在

2.1 先执行java cn/uce/uop/jmx/JmxC -l
解决办法:
将%JAVA_HOME%/jre/bin/attach.dll 拷贝到 %JAVA_HOME%/bin/目录下
再执行上述命令:
会列出当前的java进程,我们选择我们需要监控的进程,执行如下命令
2.2 javacn/uce/uop/jmx/JmxC -p 13260
pid:13260
desc:sun.tools.attach.WindowsAttachProvider@4617c264: 13260 cn.uce.uop.Test
process id:13260
args:-Dfile.encoding=UTF-8
conn:service:jmx:rmi://127.0.0.1/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc2AAtVbmljYXN0UmVmMgAACzEwLjIwMS4yLjYzAADh5wsYyZlaKbJNg8lsRAAAAWC1Eqi1gAEAeA==
beanSet num:20
name:org.apache.commons.pool2:type=GenericObjectPool,name=pool
NumActive->30
NumIdle->0
NumWaiters->1
TimeBetweenEvictionRunsMillis->30000
Fairness->false
Lifo->true
Closed->false
MaxTotal->30
MaxIdle->5
MinIdle->0
TestOnCreate->false
TestOnReturn->false
TestWhileIdle->true
NumTestsPerEvictionRun->-1
MinEvictableIdleTimeMillis->60000
TestOnBorrow->false
BlockWhenExhausted->true
MaxWaitMillis->-1
DestroyedByEvictorCount->0
MeanIdleTimeMillis->0
CreatedCount->30
DestroyedCount->0
CreationStackTrace->java.lang.Exception
at org.apache.commons.pool2.impl.BaseGenericObjectPool.<init>(BaseGenericObjectPool.java:139)
at org.apache.commons.pool2.impl.GenericObjectPool.<init>(GenericObjectPool.java:107)
at redis.clients.util.Pool.initPool(Pool.java:44)
at redis.clients.util.Pool.<init>(Pool.java:23)
at redis.clients.jedis.JedisPool.<init>(JedisPool.java:185)
at redis.clients.jedis.JedisPool.<init>(JedisPool.java:162)
at redis.clients.jedis.JedisPool.<init>(JedisPool.java:109)
at cn.uce.uop.Test.main(Test.java:19)
BorrowedCount->38
ReturnedCount->8
MeanActiveTimeMillis->0
DestroyedByBorrowValidationCount->0
RemoveAbandonedOnMaintenance->false
MaxBorrowWaitTimeMillis->41
LogAbandoned->false
AbandonedConfig->false
RemoveAbandonedOnBorrow->false
RemoveAbandonedTimeout->2147483647
MeanBorrowWaitTimeMillis->1
上述会列出通过jmx能监控的MBean属性
下一步我们就可以对重点参数进行动态监控
2.3 java cn/uce/uop/jmx/JmxC -p 13260 -n org.apache.commons.pool2:type=GenericObjectPool,name=pool -a NumActive,NumIdle,NumWaiters,BorrowedCount,ReturnedCount,BorrowedCount-ReturnedCount,CreatedCount,DestroyedCount,DestroyedByEvictorCount
注意,-n 后面的值都来源于2,2那个命令的输出
文章来源: blog.csdn.net,作者:中间件兴趣圈,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/prestigeding/article/details/78950758
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)