Java獲取虛擬機內存和操作系統內存及其線程


為什么要獲取虛擬機內存和操作系統內存呢?

虛擬機內存,這里主要指JVM。為了防止有的時候因為JVM內存問題導致服務器宕機,所以有必要監控JVM的內存。當達到一定值時,通過郵件及時通知,防止線上宕機造成更大的損失。這里監控操作系統的內存同樣如此。因為一個服務器上,tomcat,mysql,redis,mongodb,zabbix,nexus,jenkins,maven等等都是要占用操作系統的內存的。

特別是tomcat,mysql等等,線上每天都會產生大量的日志,而這些日志不能刪。當然了,通過shell腳本可以定期對這些做備份。但是就拿我上家公司來說,一個服務器上,通常運行5到6個應用。這5到6個應用,雖說以crm和erp為主,對應網站性能和線程並發方面雖要求不高,但是它們在線上也會有大量日志輸出,這些日志通常對於解決一些隱性Bug有很大的幫助,同時他們也會占用系統內存的。

關於郵件監控可以參考我的這篇文章:Spring定時任務使用和如何使用郵件監控服務器

另外在此也介紹下hutools這個開源項目,這個開源項目也提供與下面java代碼一樣的功能(系統屬性調用)

參考地址為:http://hutool.mydoc.io/

直接main方法運行,即可獲得對應的信息

代碼如下:

import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;

public class MonitorInfoTest {
 
    public static void main(String[] args) {
 
        // 虛擬機級內存情況查詢
        long vmFree = 0;
        long vmUse = 0;
        long vmTotal = 0;
        long vmMax = 0;
        int byteToMb = 1024 * 1024;
        Runtime rt = Runtime.getRuntime();
        vmTotal = rt.totalMemory() / byteToMb;
        vmFree = rt.freeMemory() / byteToMb;
        vmMax = rt.maxMemory() / byteToMb;
        vmUse = vmTotal - vmFree;
        System.out.println("JVM內存已用的空間為:" + vmUse + " MB");
        System.out.println("JVM內存的空閑空間為:" + vmFree + " MB");
        System.out.println("JVM總內存空間為:" + vmTotal + " MB");
        System.out.println("JVM總內存空間為:" + vmMax + " MB");
 
        System.out.println("======================================");
        // 操作系統級內存情況查詢
        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
        String os = System.getProperty("os.name");
        long physicalFree = osmxb.getFreePhysicalMemorySize() / byteToMb;
        long physicalTotal = osmxb.getTotalPhysicalMemorySize() / byteToMb;
        long physicalUse = physicalTotal - physicalFree;
        System.out.println("操作系統的版本:" + os);
        System.out.println("操作系統物理內存已用的空間為:" + physicalFree + " MB");
        System.out.println("操作系統物理內存的空閑空間為:" + physicalUse + " MB");
        System.out.println("操作系統總物理內存:" + physicalTotal + " MB");
        
        // 獲得線程總數
        ThreadGroup parentThread;
        int totalThread = 0;
        for (parentThread = Thread.currentThread().getThreadGroup(); parentThread
                .getParent() != null; parentThread = parentThread.getParent()) {
            totalThread = parentThread.activeCount();
        }
        System.out.println("獲得線程總數:" + totalThread);
    }
}

 


免責聲明!

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



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