介紹一個我開發的Java虛擬機監控API

前段時間我在看《深入理解Java虛擬機》一書,打算好好學學虛擬機的知識,在看到《第4章 虛擬機性能監控與故障處理工具》時產生了諸多靈感。首先是瞭解這些監控工具能幹嘛?然後發現了其中一些侷限性,接着視圖解讀部分命令源碼,自己也想做一個虛擬機監控工具,但是想想做工具應用很簡單,如果能將jdk提供的調試庫進行改造然後封裝成API,那麼每個開發者豈不都可以很容易的寫自己的虛擬機監控工具了嗎?於是我開發了自己的第一個API:VmConsole-Api

求顆星星鼓勵一下(ಥ_ಥ)

VmConsole簡介

VmConsole-Api是一個jvm虛擬機性能監控API,將oracle jdk提供的tools.jar、sa-jdi.jar包進行了功能拓展,對一些監控命令結果進行了封裝,你可以方便地從對象中讀取每一個參數和結果。該類庫並不是簡單地使用運行時exec()調用jps、jstat、jstack等命令,而是從底層深度拓展而來,所以你不需要配置java環境變量就可以通過Java代碼對虛擬機進行監控。

目前VmConsole已經發布到Maven中央倉庫了,使用者可以直接引入Maven依賴即可,當然非Maven項目也可從我的Github中下載Jar包導入項目

當然可能有其他公司或者大佬開發出了虛擬機監控API,如果有就當是我學習練手啦,同時希望有相關信息的朋友告知作者我一下。

jdk監控工具的侷限性

在jdk中提供有很多的監控工具,比如jps、jstack、jstat等,還有圖像界面的jconsole、visualvm等,但是這些工具僅用於調試,如果在自己的項目中使用確很難,除非調用exec()方法,但是這種方法很影響程序性能。

在tools.jar包裏面查看這些命令類庫源碼可以發現,裏面全都是一次性執行就結束的函數體,大量使用了System.exit()關閉虛擬機和System.out.println()輸出結果,可用性很低。讀者可以看我的這篇文章瞭解一些命令執行流程:從源碼角度深度分析JVM虛擬機監控工具

對tools.jar功能拓展

tools.jar和sa-jdi.jar是虛擬機監控最主要的兩個類庫,jdk/bin目錄下的jps、jconsole、visualvm等程序都是基於這兩個包進行開發的,在tools.jar和sa-jdi.jar中有很多可以直接使用的方法,它們相當於是對虛擬機信息獲取類進行的另一層封裝,但是這些封裝都僅僅是一次執行就結束,重用性很低,類中的執行方法無法直接調用。我通過方法重載、類繼承等方式去拓展了一些類,有些類的方法和屬性是private的,無法去拓展,就直接重構了整個類,比如beifengtz.vmconsole.tools.MyTool類就是對sa-jdi.jar中的Tool類方法進行了重構。

我在編寫時考慮到了可拓展性,在原jdk的類方法固定死了輸出方式爲System.out.println(),改編之後提供了打印流和對象接收結果兩種方式,更方便開發者功能拓展。

簡單使用

首先你需要將vmconsole-api.jar包導入到項目中,可以是直接導入jar也可以是Maven。

然後就可以直接使用其中封裝的命令了,詳細使用說明請前往github查看。這裏以jstat命令爲例。

如果你是在本地使用jstat命令查看vmId爲8804的gc情況,在控制檯結果是這樣的:

如果你用vmconsole調用函數,只需要在自己的代碼中這樣調用:

命令執行的結果是一個對象,爲了方便觀看,將其格式處理之後:

除了衆多查詢虛擬機信息的接口之外還有向其他虛擬機執行命令的函數,封裝於jcmd命令。比如你現在使用的程序是虛擬機A,另一個程序在虛擬機B,在虛擬機A中想要對虛擬機B執行GC,那麼你只需要這樣調用:

使用場景

如果你想寫一個桌面版的虛擬機監控可視化程序,VmConsole能給你提供許多方便。如果你想寫一個web版的虛擬機監控工具,那麼VmConsole是你很好的選擇,因爲它不是簡單地執行exec()命令,而是從jdk命令底層封裝,相比於執行exec,它能給你的程序提升很大的性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章