生产线上,我们的服务基本都是在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.