為什么要獲取虛擬機內存和操作系統內存呢?
虛擬機內存,這里主要指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); } }