溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java程序員應(yīng)該知道的應(yīng)用監(jiān)測(cè)技術(shù)是什么

發(fā)布時(shí)間:2021-10-20 17:13:02 來源:億速云 閱讀:203 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹java程序員應(yīng)該知道的應(yīng)用監(jiān)測(cè)技術(shù)是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

1 引言:為什么需要監(jiān)測(cè)java應(yīng)用

java開發(fā)人員都知道,啟動(dòng)java應(yīng)用使用的是java(class文件)或java -jar(jarwar包)命令。而java命令其實(shí)就是啟動(dòng)一個(gè)java虛擬機(jī)(JVM),程序就是運(yùn)行在JVM上,JVM負(fù)責(zé)類加載,運(yùn)行時(shí)區(qū)域堆棧分配等工作,而堆棧分別用于程序中的對(duì)象及線程使用,分別影響的系統(tǒng)的cpu及內(nèi)存,如果程序涉及文件或數(shù)據(jù)讀寫,還會(huì)影響系統(tǒng)的IO。因此,一個(gè)java應(yīng)用啟動(dòng)后,如果不對(duì)它所占用的資源情況進(jìn)行監(jiān)測(cè),無疑于一架飛機(jī)起飛了,卻沒有儀表盤,這種飛機(jī)估計(jì)沒有人敢坐。因此,作為開發(fā)人員,得清楚應(yīng)用啟動(dòng)后的運(yùn)行情況,并能夠?qū)?yīng)用運(yùn)行狀況進(jìn)行監(jiān)測(cè),如此,才能及時(shí)預(yù)測(cè)有可能發(fā)生的問題進(jìn)行及時(shí)修正或發(fā)生問題后可以更快,更好地找到原因所在,進(jìn)而解決??上驳氖?,程序本身,java工具和第三方工具,都為我們提供了很多監(jiān)測(cè)java應(yīng)用的方法,因此,作為java開發(fā)人員,有必要對(duì)它們做一個(gè)系統(tǒng)的了解,以便于在實(shí)際應(yīng)用中(特別是在生產(chǎn)環(huán)境中)更從容,更有效率的處理問題。

2 監(jiān)測(cè)什么

一個(gè)java應(yīng)用運(yùn)行起來,若出現(xiàn)問題,我們第一反應(yīng)肯定是查看日志,查看一下具體是報(bào)什么錯(cuò),若沒有報(bào)錯(cuò),只是運(yùn)行很慢,或者只是暫時(shí)還沒有報(bào)錯(cuò),那我們需要監(jiān)測(cè)什么內(nèi)容呢?這一節(jié),對(duì)比我們平時(shí)使用操作系統(tǒng),來看看對(duì)于java應(yīng)用,需要監(jiān)測(cè)什么內(nèi)容。

2.1 系統(tǒng)監(jiān)測(cè)內(nèi)容

對(duì)于我們平時(shí)使用的操作系統(tǒng),如windows,linux系統(tǒng),出現(xiàn)應(yīng)用打開緩慢,系統(tǒng)響應(yīng)緩慢,一般就是先查看系統(tǒng)的cpu運(yùn)行和內(nèi)存使用情況,找出占用資源高的進(jìn)程,定位原因,在windows,直接在任務(wù)管理器-->性能中查看,如下圖。

java程序員應(yīng)該知道的應(yīng)用監(jiān)測(cè)技術(shù)是什么

linux,可以使用top,free,df,iostat等命令進(jìn)行查看,如下圖。

java程序員應(yīng)該知道的應(yīng)用監(jiān)測(cè)技術(shù)是什么

在日常的運(yùn)維過程中,也是對(duì)系統(tǒng)的磁盤使用、IO、CPU、內(nèi)存、網(wǎng)絡(luò)等情況進(jìn)行監(jiān)測(cè),爭(zhēng)取及時(shí)發(fā)現(xiàn)占用資源高的進(jìn)程,定位問題然后處理。

2.2 java應(yīng)用監(jiān)測(cè)內(nèi)容

相對(duì)于操作系統(tǒng),java應(yīng)用需要監(jiān)測(cè)的內(nèi)容也有類似的地方,如占用的cpu情況,內(nèi)存情況,其中,會(huì)包含java應(yīng)用的JVM參數(shù),堆占用情況,線程運(yùn)行狀態(tài),類加載情況,垃圾回收(GC)情況。至于為什么需要監(jiān)測(cè)這些內(nèi)容,就需要對(duì)java的虛擬機(jī)(JVM)有一定的了解,由于本文JVM涉及內(nèi)容較多,后面有機(jī)會(huì)再對(duì)JVM進(jìn)行詳細(xì)講解,這里可以對(duì)java的JVM體系作一個(gè)簡(jiǎn)要介紹,以便于讀者對(duì)后面章節(jié)的理解。見下圖:

java程序員應(yīng)該知道的應(yīng)用監(jiān)測(cè)技術(shù)是什么

  • 當(dāng)java運(yùn)行一個(gè)應(yīng)用,就會(huì)生成一個(gè)JVM的實(shí)例,而java應(yīng)用則運(yùn)行于此JVM實(shí)例中,當(dāng)應(yīng)用退出,JVM實(shí)例也會(huì)關(guān)閉。啟動(dòng)多個(gè)java應(yīng)用,也會(huì)啟動(dòng)多個(gè)JVM實(shí)例,它們不會(huì)相互影響(當(dāng)然,它們都會(huì)占用系統(tǒng)的資源)。

  • 虛擬機(jī)主要有三大模塊,一個(gè)類加載子系統(tǒng)(Class Loader Subsystem,負(fù)責(zé)加載類),一個(gè)執(zhí)行引擎(Execution Engine,負(fù)責(zé)執(zhí)行類的方法指令和垃圾回收),一個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime Data Areas,負(fù)責(zé)存放程序運(yùn)行時(shí)的數(shù)據(jù))。

  • 其中運(yùn)行時(shí)數(shù)據(jù)區(qū)分為方法區(qū)(存儲(chǔ)如類信息,方法信息,引用,常量池等),堆(存儲(chǔ)類實(shí)例對(duì)象和數(shù)組),java棧(以棧方式存放以幀為單位保存線程的運(yùn)行狀態(tài)幀),本地方法棧(跟本地方法相關(guān)的數(shù)據(jù)區(qū)),程序計(jì)數(shù)器(每一個(gè)線程都有它自己的程序計(jì)數(shù)器,表示下一條將被執(zhí)行指令的“地址”)。

  • java應(yīng)用啟動(dòng)流程就是通過類加載子系統(tǒng)加載相關(guān)的類,然后把相關(guān)數(shù)據(jù)如類信息,方法等存到方法區(qū)的棧中,實(shí)例化相關(guān)的類,同時(shí)把實(shí)例對(duì)象存儲(chǔ)在堆中,程序運(yùn)行位置則是每個(gè)線程使用計(jì)數(shù)器來指定。方法區(qū)和堆是線程共享的,程序計(jì)數(shù)器及Java棧是線程私有的。

  • 運(yùn)行時(shí)數(shù)據(jù)區(qū)是java應(yīng)用運(yùn)行時(shí)的監(jiān)測(cè)區(qū)域,其中各個(gè)區(qū)域的內(nèi)存情況,特別是堆的內(nèi)存使用情況,是重點(diǎn)區(qū)域。堆還會(huì)分年輕代、年老代及 Metaspace,垃圾回收器會(huì)進(jìn)行分代回收。通過它的回收情況監(jiān)測(cè),可以檢測(cè)到是否存在內(nèi)存泄漏,而java棧則與線程有關(guān),線程的運(yùn)行狀態(tài)又與CPU相關(guān),因此java棧的監(jiān)測(cè)可以知道CPU占用過大的問題,同時(shí)方法區(qū)和java棧的占用內(nèi)存大小也是一個(gè)監(jiān)測(cè)的指標(biāo)。

3 如何監(jiān)測(cè)

經(jīng)過上面的描述,我們大概已經(jīng)知道一個(gè)java應(yīng)用啟動(dòng)后,我們?yōu)槭裁葱枰O(jiān)測(cè)java應(yīng)用以及需要監(jiān)測(cè)哪些東西。那落實(shí)到實(shí)際應(yīng)用中,該如何進(jìn)行監(jiān)測(cè)呢?下面通過對(duì)java應(yīng)用監(jiān)測(cè)工具及方法進(jìn)行一個(gè)概要介紹,后續(xù)將會(huì)以系列文章的形式,對(duì)各個(gè)監(jiān)測(cè)工具及方法進(jìn)行詳細(xì)介紹。

按監(jiān)測(cè)工具的監(jiān)測(cè)方式,主要分為以下四大類:

  • 程序內(nèi)置-日志及監(jiān)控頁面

  • java自帶命令行監(jiān)測(cè)工具

  • java自帶可視化監(jiān)測(cè)工具

  • 第三方診斷工具

3.1 程序內(nèi)置監(jiān)測(cè)

程序內(nèi)置監(jiān)測(cè)就比較簡(jiǎn)單,在初學(xué)java時(shí),最常用的就是使用System.out.println()把自己想要輸出的內(nèi)容輸出,在開發(fā)階段也有人喜歡這樣,一方面可以輸出業(yè)務(wù)內(nèi)容,監(jiān)測(cè)功能的正常與否,另一方面可以輸出系統(tǒng)屬性System.getProperties()System.getProperty()。當(dāng)然,現(xiàn)在更多的使用日志框架進(jìn)行輸出,并把日志按級(jí)別輸出到文件中,如log4jlogback。對(duì)于Spring Boot應(yīng)用,還可以使用actuator來監(jiān)測(cè)程序運(yùn)行情況。tomcat容器自身也帶有監(jiān)測(cè)頁面。此類監(jiān)測(cè)主要特點(diǎn)是程序內(nèi)置,并且通過日志輸出來監(jiān)測(cè),開發(fā)人員相對(duì)比較熟悉了,一般來說在開發(fā)和測(cè)試階段比較常用,而生產(chǎn)環(huán)境下,日志一般是error級(jí)別或者由于安全考慮,自帶的一些監(jiān)測(cè)頁面有可能會(huì)關(guān)閉。因此,此類監(jiān)測(cè)不再細(xì)說。

3.2 java自帶命令行監(jiān)測(cè)工具

在jdk的安裝目錄下的的bin目錄,已經(jīng)提供了多種命令行監(jiān)測(cè)工具,以便于開發(fā)人員和運(yùn)維人員監(jiān)測(cè)java應(yīng)用,同時(shí)方便開發(fā)及運(yùn)維人員對(duì)問題進(jìn)行診斷,因此,此類工具是java應(yīng)用監(jiān)測(cè)的重要手段。一般來說,常用的命令行工具包括jps,jinfo,jmap,jstack,jstat,其中

  • jps查看java進(jìn)程ID

  • jinfo查看及調(diào)整虛擬機(jī)參數(shù)

  • jmap查看堆(heap)使用情況及生成堆快照

  • jstack查看線程運(yùn)行狀態(tài)及生成線程快照

  • jstat顯示進(jìn)程中的類裝載、內(nèi)存、垃圾收集等運(yùn)行數(shù)據(jù)。

通過這些工具,基本上可以了解java應(yīng)用的內(nèi)存變化狀態(tài),線程運(yùn)行狀態(tài)等信息,進(jìn)而為應(yīng)用監(jiān)測(cè)及問題診斷提供依據(jù)。后面的文章將會(huì)對(duì)這些工具進(jìn)行詳細(xì)描述。

3.3 java自帶可視化監(jiān)測(cè)工具

除了命令行工具,在windows平臺(tái)下,jdk還提供了可視化監(jiān)測(cè)工具,以更直觀,更方便的方式對(duì)java應(yīng)用運(yùn)行狀況進(jìn)行監(jiān)測(cè)。這兩款工具分別是jconsolejvisualvm,在jdk下的bin目錄下可以找到。它們均可監(jiān)測(cè)本地及遠(yuǎn)程的java應(yīng)用,包括堆使用情況,線程使用,cpu使用,類加載情況,gc情況,jvisualvm還可以生成相應(yīng)的堆和線程快照,同時(shí)還可以使用相應(yīng)的插件,以便于進(jìn)一步分析。后面的文章將會(huì)對(duì)這兩款工具的使用進(jìn)行詳細(xì)描述。

3.4 第三方診斷工具

除了java自帶的工具,一些第三方的工具也是監(jiān)測(cè)及分析診斷,性能調(diào)優(yōu)的利器,包括MAT,BTraceArthas。其中

  • MATeclipse的內(nèi)存分析插件,通過MAT可以對(duì)dump出來的堆快照進(jìn)行分析,并且輔助分析內(nèi)存泄露原因,快速的計(jì)算出在內(nèi)存中對(duì)象的占用大小,垃圾收集器的回收工作情況,并可以通過報(bào)表直觀的查看到可能造成這種結(jié)果的對(duì)象。

  • BTrace是是sun推出的一款Java 動(dòng)態(tài)、安全追蹤(監(jiān)控)工具,可以在不停機(jī)的情況下監(jiān)控系統(tǒng)運(yùn)行情況,并且做到最少的侵入,占用最少的系統(tǒng)資源。特別適用在生產(chǎn)環(huán)境下對(duì)java應(yīng)用進(jìn)行監(jiān)測(cè),問題排查。

  • Arthas是阿里開源的在線Java診斷工具,同樣可以在不停機(jī)情況監(jiān)控系統(tǒng),包括內(nèi)存情況,線程情況,GC情況,運(yùn)行時(shí)數(shù)據(jù),也可以監(jiān)測(cè)方法參數(shù)、返回值,異常返回等數(shù)據(jù),堪稱神器,在生產(chǎn)環(huán)境下使用非常方便。

關(guān)于java程序員應(yīng)該知道的應(yīng)用監(jiān)測(cè)技術(shù)是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI