JMX客户端及对commons-pool的监控

生产线上,我们的服务基本都是在linux环境下部署的,当高并发的时候,机器的负载是比较高的,所以我们只能在linux机器上执行一些简单的命令行工具,如jps,jstack,jinfo等,像重量级的jconsole,jvisualvm这些首先需要桌面环境才能观看,服务器肯定是没有开启X client的,所以只能通过jmx在远程客户端观看,但这种情况下,势必会对本机造成一些不必要的资源占用,如网络带宽等。但是想mbean这些对象的监控目前又只能通过jconsole,jvisualvm这些jmx客户端访问,想要在本机以命令行的方式查看还是比较困难的。本文的目的就是介绍下怎么在linux服务器下以命令下的方式进行jmx监控。

1、利用jmx连接本机java进程

直接看代码,代码写的有点乱,需要优化。

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.
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值