咱們知道,在JAVA_HOME/bin下有諸多內置命令,是咱們在使用Java或者監控、排查它時用到的命令。其中tools.jar中包含了大多數命令的執行入口。後面我將寫一系列對這些命令的實現細節的文章,使用方法文本不作討論。java
jps命令是java開發人員最經常使用的命令之一,它輸出了當前用戶下java進程的一些基本信息。咱們從jps開始閱讀,它的入口在sun.tools.jstack.Jps中。jvm
在參數校驗邏輯以後,獲取到jps命令中監控的目標機,而後從中拿到目標機中可用的jvm進程。ide
HostIdentifier hostId = arguments.hostId(); MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(hostId); // get the set active JVMs on the specified host. Set jvms = monitoredHost.activeVms();
MonitoredHost監控的目標機能夠是本地進程,也能夠是經過RMI遠程調用的進程。wordpress
獲取到監控主機以後就要獲取運行列表,這裏是jps的數據來源,咱們local模式爲例,在MonitoredHostProvider#activeVms中獲取的數據來源於這樣一行代碼:工具
PerfDataFile.getLocalVmId(paramX));
而paramX是根據用戶名和必定規則拼湊起來獲得:性能
tmpDirName + dirNamePrefix + user + File.separator;
tmpDirName取自String tmpdir = System.getProperty("java.io.tmpdir"); 參考初始化參數:-Djava.io.tmpdir。默認爲.net
dirNamePrefix 爲固定值:hsperfdata_code
以admin角色爲例最終獲得/tmp/hsperfdata_xxx目錄。順藤摸瓜,直接到這個地址下瞧一瞧發現真有這麼幾個文件夾。orm
打開後發現裏面的文件均爲進程號,文件內容較多,可是可閱讀,是一些啓動參數、運行信息等。那麼hsperfdata_xxx文件是幹哈的?它是JVM Performance Counters的一部分,jvmstat經過文件的方式記錄了進程在運行時刻的一些性能或運行信息。blog
瞭解到文件內容以後咱們接着看Jps的代碼,jps根據輸入的參數對文件內容進行格式化輸出,簡而言之就是根據不一樣的選項對性能信息進行過濾。
至此,jps的命令結束。其餘相似的性能監控工具如jconsole、jvisualvm的部分數據來源均爲hsperfdata_xxx文件。
附:
jps無效處理:不知道你們有沒有遇到過jps無效的狀況,如「pid-- process information unavailable」。經過上面的內容瞭解到jps的數據來源爲hsperfdata_xxx文件夾,jps無效多數緣由與此文件或文件夾的權限、大小、磁盤空間等問題有關,但願這個信息可以提供一些思路。
https://zeroproductionincidents.wordpress.com/tag/jvm-performance-counters/