您好,登錄后才能下訂單哦!
這篇文章給大家介紹java程序員應該知道的應用監測技術是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
java開發人員都知道,啟動java應用使用的是java
(class
文件)或java -jar
(jar
或war
包)命令。而java
命令其實就是啟動一個java虛擬機(JVM
),程序就是運行在JVM
上,JVM
負責類加載,運行時區域堆棧分配等工作,而堆棧分別用于程序中的對象及線程使用,分別影響的系統的cpu及內存,如果程序涉及文件或數據讀寫,還會影響系統的IO。因此,一個java應用啟動后,如果不對它所占用的資源情況進行監測,無疑于一架飛機起飛了,卻沒有儀表盤,這種飛機估計沒有人敢坐。因此,作為開發人員,得清楚應用啟動后的運行情況,并能夠對應用運行狀況進行監測,如此,才能及時預測有可能發生的問題進行及時修正或發生問題后可以更快,更好地找到原因所在,進而解決。可喜的是,程序本身,java工具和第三方工具,都為我們提供了很多監測java應用的方法,因此,作為java開發人員,有必要對它們做一個系統的了解,以便于在實際應用中(特別是在生產環境中)更從容,更有效率的處理問題。
一個java應用運行起來,若出現問題,我們第一反應肯定是查看日志,查看一下具體是報什么錯,若沒有報錯,只是運行很慢,或者只是暫時還沒有報錯,那我們需要監測什么內容呢?這一節,對比我們平時使用操作系統,來看看對于java應用,需要監測什么內容。
對于我們平時使用的操作系統,如windows
,linux
系統,出現應用打開緩慢,系統響應緩慢,一般就是先查看系統的cpu運行和內存使用情況,找出占用資源高的進程,定位原因,在windows
,直接在任務管理器-->性能
中查看,如下圖。
在linux
,可以使用top
,free
,df
,iostat
等命令進行查看,如下圖。
在日常的運維過程中,也是對系統的磁盤使用、IO、CPU、內存、網絡等情況進行監測,爭取及時發現占用資源高的進程,定位問題然后處理。
相對于操作系統,java應用需要監測的內容也有類似的地方,如占用的cpu情況,內存情況,其中,會包含java應用的JVM參數,堆占用情況,線程運行狀態,類加載情況,垃圾回收(GC
)情況。至于為什么需要監測這些內容,就需要對java的虛擬機(JVM)有一定的了解,由于本文JVM涉及內容較多,后面有機會再對JVM進行詳細講解,這里可以對java的JVM體系作一個簡要介紹,以便于讀者對后面章節的理解。見下圖:
當java運行一個應用,就會生成一個JVM的實例,而java應用則運行于此JVM實例中,當應用退出,JVM實例也會關閉。啟動多個java應用,也會啟動多個JVM實例,它們不會相互影響(當然,它們都會占用系統的資源)。
虛擬機主要有三大模塊,一個類加載子系統(Class Loader Subsystem
,負責加載類),一個執行引擎(Execution Engine
,負責執行類的方法指令和垃圾回收),一個運行時數據區(Runtime Data Areas
,負責存放程序運行時的數據)。
其中運行時數據區分為方法區(存儲如類信息,方法信息,引用,常量池等),堆(存儲類實例對象和數組),java棧(以棧方式存放以幀為單位保存線程的運行狀態幀),本地方法棧(跟本地方法相關的數據區),程序計數器(每一個線程都有它自己的程序計數器,表示下一條將被執行指令的“地址”)。
java應用啟動流程就是通過類加載子系統加載相關的類,然后把相關數據如類信息,方法等存到方法區的棧中,實例化相關的類,同時把實例對象存儲在堆中,程序運行位置則是每個線程使用計數器來指定。方法區和堆是線程共享的,程序計數器及Java棧是線程私有的。
運行時數據區是java應用運行時的監測區域,其中各個區域的內存情況,特別是堆的內存使用情況,是重點區域。堆還會分年輕代、年老代及 Metaspace
,垃圾回收器會進行分代回收。通過它的回收情況監測,可以檢測到是否存在內存泄漏,而java棧則與線程有關,線程的運行狀態又與CPU相關,因此java棧的監測可以知道CPU占用過大的問題,同時方法區和java棧的占用內存大小也是一個監測的指標。
經過上面的描述,我們大概已經知道一個java應用啟動后,我們為什么需要監測java應用以及需要監測哪些東西。那落實到實際應用中,該如何進行監測呢?下面通過對java應用監測工具及方法進行一個概要介紹,后續將會以系列文章的形式,對各個監測工具及方法進行詳細介紹。
按監測工具的監測方式,主要分為以下四大類:
程序內置-日志及監控頁面
java自帶命令行監測工具
java自帶可視化監測工具
第三方診斷工具
程序內置監測就比較簡單,在初學java時,最常用的就是使用System.out.println()
把自己想要輸出的內容輸出,在開發階段也有人喜歡這樣,一方面可以輸出業務內容,監測功能的正常與否,另一方面可以輸出系統屬性System.getProperties()
及System.getProperty()
。當然,現在更多的使用日志框架進行輸出,并把日志按級別輸出到文件中,如log4j
及logback
。對于Spring Boot
應用,還可以使用actuator
來監測程序運行情況。tomcat
容器自身也帶有監測頁面。此類監測主要特點是程序內置,并且通過日志輸出來監測,開發人員相對比較熟悉了,一般來說在開發和測試階段比較常用,而生產環境下,日志一般是error
級別或者由于安全考慮,自帶的一些監測頁面有可能會關閉。因此,此類監測不再細說。
在jdk的安裝目錄下的的bin目錄,已經提供了多種命令行監測工具,以便于開發人員和運維人員監測java應用,同時方便開發及運維人員對問題進行診斷,因此,此類工具是java應用監測的重要手段。一般來說,常用的命令行工具包括jps
,jinfo
,jmap
,jstack
,jstat
,其中
jps
查看java進程ID
jinfo
查看及調整虛擬機參數
jmap
查看堆(heap)使用情況及生成堆快照
jstack
查看線程運行狀態及生成線程快照
jstat
顯示進程中的類裝載、內存、垃圾收集等運行數據。
通過這些工具,基本上可以了解java應用的內存變化狀態,線程運行狀態等信息,進而為應用監測及問題診斷提供依據。后面的文章將會對這些工具進行詳細描述。
除了命令行工具,在windows平臺下,jdk還提供了可視化監測工具,以更直觀,更方便的方式對java應用運行狀況進行監測。這兩款工具分別是jconsole
和jvisualvm
,在jdk下的bin目錄下可以找到。它們均可監測本地及遠程的java應用,包括堆使用情況,線程使用,cpu使用,類加載情況,gc情況,jvisualvm
還可以生成相應的堆和線程快照,同時還可以使用相應的插件,以便于進一步分析。后面的文章將會對這兩款工具的使用進行詳細描述。
除了java自帶的工具,一些第三方的工具也是監測及分析診斷,性能調優的利器,包括MAT
,BTrace
及Arthas
。其中
MAT
是eclipse
的內存分析插件,通過MAT
可以對dump出來的堆快照進行分析,并且輔助分析內存泄露原因,快速的計算出在內存中對象的占用大小,垃圾收集器的回收工作情況,并可以通過報表直觀的查看到可能造成這種結果的對象。
BTrace
是是sun推出的一款Java 動態、安全追蹤(監控)工具,可以在不停機的情況下監控系統運行情況,并且做到最少的侵入,占用最少的系統資源。特別適用在生產環境下對java應用進行監測,問題排查。
Arthas
是阿里開源的在線Java診斷工具,同樣可以在不停機情況監控系統,包括內存情況,線程情況,GC情況,運行時數據,也可以監測方法參數、返回值,異常返回等數據,堪稱神器,在生產環境下使用非常方便。
關于java程序員應該知道的應用監測技術是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。