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;
        }
    }
    
    
}

 

posted @ 2017-02-07 17:46  朱小杰  阅读(15980)  评论(3编辑  收藏  举报