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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM