JAVA JMX协议监控

  JMX协议监控,可通过JMX协议远程监控,实时监控线上jvm情况,并通过平台管理界面进行

展示,可以通过监控实时获得线上服务器运行情况。

  可以监控内存、实时线程、共享内存等各种信息。

  获取实时线程信息并显示:

import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

 /**
 * Created by liubaofeng on 2017/3/10.
 * 根据jmx配置
 * 将线程信息返回
 */
public class JvmRuntimeServiceImpl implements JvmRuntimeService {
    protected static final Logger logger = LoggerFactory.getLogger("file_logger");
    private Map<String,MBeanServerConnection> map = new HashMap<>();
    

        @Override
    public List<JvmRuntimeModel> threadRuntime(String url)  {
        if(logger.isDebugEnabled())
            logger.debug("url:"+url);
        String jmxURL = "service:jmx:rmi:///jndi/rmi://"+url+"/jmxrmi";
        List<JvmRuntimeModel> resultList = null;
        if(!map.containsKey(jmxURL)) {
            MBeanServerConnection mBeanServerConnection = null;
            try {
                mBeanServerConnection = connection(jmxURL);
            } catch (IOException e) {
                if (logger.isErrorEnabled())
                    logger.error(e.getMessage(), e);
            }
            map.put(jmxURL,mBeanServerConnection);
            try {
                ThreadInfo[] threadInfos = thread(mBeanServerConnection);
                resultList = getJvmRuntimeModelList(threadInfos);
            } catch (IOException e) {
                if (logger.isErrorEnabled())
                    logger.error(e.getMessage(), e);
            }
        }else{
            MBeanServerConnection mBeanServerConnection = map.get(jmxURL);
            try {
                ThreadInfo[] threadInfos = thread(mBeanServerConnection);
                resultList = getJvmRuntimeModelList(threadInfos);
            } catch (IOException e) {
                if (logger.isErrorEnabled())
                    logger.error(e.getMessage(), e);
            }
        }
        return resultList;
    }
    

        /**
     * 建立jmx连接
     * @param jmxURL
     * @return
     * @throws IOException
     */
    private MBeanServerConnection connection(String jmxURL)throws IOException{
        JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
        JMXConnector connector = JMXConnectorFactory.connect(serviceURL, null);
        MBeanServerConnection mBeanServerConnection = connector.getMBeanServerConnection();
        return mBeanServerConnection;
    }
            

    /**
     * 取threadinfo信息.
     * @param mBeanServerConnection
     * @throws IOException
     */
    private ThreadInfo[] thread(MBeanServerConnection mBeanServerConnection) throws IOException {
        ThreadMXBean threadMXBean = ManagementFactory
                .newPlatformMXBeanProxy(mBeanServerConnection,
                        ManagementFactory.THREAD_MXBEAN_NAME,
                        ThreadMXBean.class);
        long[] ids = threadMXBean.getAllThreadIds();
        ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(ids);
        return threadInfos;
    }
            

                /**
     * 取jvm运行时信息.
     * @param threadInfos
     * @return
     */
    private List<JvmRuntimeModel> getJvmRuntimeModelList(ThreadInfo[] threadInfos){
        if(threadInfos!=null)
            return null;
        
        List<JvmRuntimeModel> list = new ArrayList<JvmRuntimeModel>(threadInfos.length);
        for(int i=0;i<threadInfos.length;i++){
            ThreadInfo threadInfo = threadInfos[i];
            String threadName = threadInfo.getThreadName();
            Thread.State threadState = threadInfo.getThreadState();
            JvmRuntimeModel jvmRuntimeModel = new JvmRuntimeModel();
            jvmRuntimeModel.id = i;
            jvmRuntimeModel.name = threadName;
            jvmRuntimeModel.state = getState(threadState);
            list.add(jvmRuntimeModel);
        }
    

            return list;
    }
    

        /**
     * 获得状态.
     * @param state
     * @return
     */
    private String getState(Thread.State state){
        if(state.equals(Thread.State.NEW))
            return "新建";
        else if(state.equals(Thread.State.RUNNABLE))
            return "执行中";
        else if(state.equals(Thread.State.BLOCKED))
            return "阻塞";
        else if(state.equals(Thread.State.WAITING))
            return "等待";
        else if(state.equals(Thread.State.TIMED_WAITING))
            return "定时等待";
        else
            return "终止";
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Java Web学习总结之数据库连接池

  用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接...

632
来自专栏非著名程序员

Android Service学习之本地服务

Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中 通过<service>来声明。可以通过contec...

1705
来自专栏向治洪

android之service

android中服务是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。你可以启动一个...

16110
来自专栏Java帮帮-微信公众号-技术文章全总结

JDBC基础入门(1)

JDBC(Java Database Connectivity)代表Java编程语言与数据库连接的标准API,然而JDBC只是接口,JDBC驱动才是真正的接口实...

3427
来自专栏芋道源码1024

【追光者系列】HikariCP 源码分析之故障检测那些思考 fail fast &amp; allowPoolSuspension

由于时间原因,本文主要内容参考了 https://segmentfault.com/a/1190000013136251 ,并结合一些思考做了增注

1004
来自专栏龙首琴剑庐

Java.NIO编程一览笔录

Java标准IO 与 Java NIO 的简单差异示意: Java标准IO Java NIO API调用 简单 复杂 底层实现 面向流(str...

3058
来自专栏java 成神之路

获取当前执行代码的类、方法、行数信息

1362
来自专栏JadePeng的技术博客

一起读源码之zookeeper(1) -- 启动分析

从本文开始,不定期分析一个开源项目源代码,起篇从大名鼎鼎的zookeeper开始。 为什么是zk,因为用到zk的场景实在太多了,大部分耳熟能详的分布式系统都有...

6426
来自专栏机器学习实践二三事

多线程TCP服务器

相关Java类 Socket public class Socket extends Object 功能:TCP客户端套接字 构造方法: Socket(In...

1879
来自专栏Java学习123

原 Java中计算程序运行耗时的方法对比

1603

扫码关注云+社区