zoukankan      html  css  js  c++  java
  • java获取当前应用的运行信息(内存,线程,运行时间,状态等)

    一:目的

    写这一段程序的原因是需要监控部署的的应用是否正常运行,并且显示其运行状态。在进程莫名死掉后甚至可以自动启动该应用。

    首先这段代码可以获取的信息如下

    /**
         * 当前进程运行的主机名
         */
        private String host;
        /**
         * 当前进程所在的IP地址
         */
        private String ipAddress;
        /**
         * 空闲内存
         */
        private long freeMemory;
        /**
         * 内存总量
         */
        private long totalMemory;
        /**
         * java虚拟机允许开启的最大的内存
         */
        private long maxMemory;
        
        /**
         * 操作系统名称
         */
        private String osName;
        /**
         * 进程号
         */
        private long pid;
        
        
        /**
         * 程序启动时间
         */
        private Date startTime;
        
        /**
         * 类所在路径
         */
        private String classPath;
        
        private String projectPath;
        
        /**
         * 程序运行时间,单位毫秒
         */
        private long runtime;
        /**
         * 线程总量
         */
        private int threadCount;

    二:获取这段信息的代码

    这里直接贴代码,并没有什么很难的逻辑

    import java.io.File;
    import java.lang.management.ManagementFactory;
    import java.lang.management.RuntimeMXBean;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.Date;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.framework.monitor.common.bean.ClientStatus;
    
    public class StatusUtil {
        public static Logger LOG = LoggerFactory.getLogger(StatusUtil.class);
        private static ClientStatus clientStatus = new ClientStatus();
        
        /**
         * 
         * @param projectName 工程名称
         * @param version 版本号
         * @param group 分组号,对应用进行分组
         * @param ipAddress 可以为NULL,为NULL则会自动获取,但是如果主机有多个网卡,可能会取错
         * @param startCMD 启动进程的命令,当应用死掉后,会调用此命令来启动
         * @param remark 备注,如果没有可以为空
         * @return
         */
        public static ClientStatus getClientStatus(String projectName,int version,String group,String ipAddress,String startCMD,String[] remark){
            clientStatus.setProjectName(projectName);
            clientStatus.setVersion(version);
            clientStatus.setRemark(remark);
            clientStatus.setGroup(group);
            RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
            Runtime runtime = Runtime.getRuntime();
            //空闲内存
            long freeMemory = runtime.freeMemory();
            clientStatus.setFreeMemory(byteToM(freeMemory));
            //内存总量
            long totalMemory = runtime.totalMemory();
            clientStatus.setTotalMemory(byteToM(totalMemory));
            //最大允许使用的内存
            long maxMemory = runtime.maxMemory();
            clientStatus.setMaxMemory(byteToM(maxMemory));
            //操作系统
            clientStatus.setOsName(System.getProperty("os.name"));
            InetAddress localHost;
            try {
                localHost = InetAddress.getLocalHost();
                String hostName = localHost.getHostName();
                clientStatus.setHost(hostName);
                if(ipAddress == null){
                    ipAddress = localHost.getHostAddress();
                }
            } catch (UnknownHostException e) {
                e.printStackTrace();
                LOG.error("无法获取当前主机的主机名与Ip地址");
                clientStatus.setHost("未知");
            }
            //ip
            clientStatus.setIpAddress(ipAddress);
            clientStatus.setId(makeClientId(projectName,ipAddress));
            //程序启动时间
            long startTime = runtimeMXBean.getStartTime();
            Date startDate = new Date(startTime);
            clientStatus.setStartTime(startDate);
            //类所在路径
            clientStatus.setClassPath(runtimeMXBean.getBootClassPath());
            //程序运行时间
            clientStatus.setRuntime(runtimeMXBean.getUptime());
            //线程总数
            clientStatus.setThreadCount(ManagementFactory.getThreadMXBean().getThreadCount());
            clientStatus.setProjectPath(new File("").getAbsolutePath());
            clientStatus.setCommitDate(new Date());
            clientStatus.setPid(getPid());
            return clientStatus;
        }
        
        /**
         * 把byte转换成M
         * @param bytes 
         * @return
         */
        public static long byteToM(long bytes){
            long kb =  (bytes / 1024 / 1024);
            return kb;
        }
        
        /**
         * 创建一个客户端ID
         * @param projectName
         * @param ipAddress
         * @return
         */
        public static String makeClientId(String projectName,String ipAddress){
            String t = projectName + ipAddress + new File("").getAbsolutePath();
            int client_id = t.hashCode();
            client_id = Math.abs(client_id);
            return String.valueOf(client_id);
        }
        
        /**
         * 获取进程号,适用于windows与linux
         * @return
         */
        public static long getPid(){
            try {
                String name = ManagementFactory.getRuntimeMXBean().getName();  
                String pid = name.split("@")[0];  
                return Long.parseLong(pid);
            } catch (NumberFormatException e) {
                LOG.warn("无法获取进程Id");
                return 0;
            }
        }
        
        
    }
  • 相关阅读:
    ubuntu安装后做得几件事情 【robby_chan】
    malloc函数的一种简单的原理性实现[转]
    了解B树 B+树
    win下格式转为utf8 编码 转码
    log4j2与slf4j日志桥接
    java获取当前行数
    java获取服务器ip地址解决linux上为127.0.0.1的问题
    log4j2的基本使用
    navicator使用之mysql
    log4j与log4j2日志文件的操作
  • 原文地址:https://www.cnblogs.com/zhuxiaojie/p/6375261.html
Copyright © 2011-2022 走看看