JVM線上故障排查的方法

本篇內(nèi)容介紹了“JVM線上故障排查的方法”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

站在用戶的角度思考問題,與客戶深入溝通,找到晉安網(wǎng)站設(shè)計(jì)與晉安網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋晉安地區(qū)。

CPU 飚高  ----請(qǐng)使用linux運(yùn)維監(jiān)控命令

以下為摘抄:

思路:首先找到 CPU 飚高的那個(gè) Java 進(jìn)程,因?yàn)槟愕?a title="服務(wù)器" target="_blank" >服務(wù)器會(huì)有多個(gè) JVM 進(jìn)程。然后找到那個(gè)進(jìn)程中的 “問題線程”,最后根據(jù)線程堆棧信息找到問題代碼。最后對(duì)代碼進(jìn)行排查。

如何操作呢?

  1. 通過 top 命令找到 CPU 消耗最高的進(jìn)程,并記住進(jìn)程 ID。

  2. 再次通過 top -Hp [進(jìn)程 ID] 找到 CPU 消耗最高的線程 ID,并記住線程 ID.

  3. 通過 JDK 提供的 jstack 工具 dump 線程堆棧信息到指定文件中。具體命令:jstack -l [進(jìn)程 ID] >jstack.log。

  4. 由于剛剛的線程 ID 是十進(jìn)制的,而堆棧信息中的線程 ID 是16進(jìn)制的,因此我們需要將10進(jìn)制的轉(zhuǎn)換成16進(jìn)制的,并用這個(gè)線程 ID 在堆棧中查找。使用 printf "%x\n" [十進(jìn)制數(shù)字] ,可以將10進(jìn)制轉(zhuǎn)換成16進(jìn)制。

  5. 通過剛剛轉(zhuǎn)換的16進(jìn)制數(shù)字從堆棧信息里找到對(duì)應(yīng)的線程堆棧。就可以從該堆棧中看出端倪。

從樓主的經(jīng)驗(yàn)來看,一般是某個(gè)業(yè)務(wù)死循環(huán)沒有出口,這種情況可以根據(jù)業(yè)務(wù)進(jìn)行修復(fù)。還有 C2 編譯器執(zhí)行編譯時(shí)也會(huì)搶占 CPU,什么是 C2編譯器呢?當(dāng) Java 某一段代碼執(zhí)行次數(shù)超過10000次(默認(rèn))后,就會(huì)將該段代碼從解釋執(zhí)行改為編譯執(zhí)行,也就是編譯成機(jī)器碼以提高速度。而這個(gè) C2編譯器就是做這個(gè)的。如何解決呢?項(xiàng)目上線后,可以先通過壓測(cè)工具進(jìn)行預(yù)熱,這樣,等用戶真正訪問的時(shí)候,C2編譯器就不會(huì)干擾應(yīng)用程序了。如果是 GC 線程導(dǎo)致的,那么極有可能是 Full GC ,那么就要進(jìn)行 GC 的優(yōu)化。

內(nèi)存問題排查 ----請(qǐng)使用JVM性能監(jiān)控工具

以下為摘抄:

說完了 CPU 的問題排查,再說說內(nèi)存的排查,通常,內(nèi)存的問題就是 GC 的問題,因?yàn)?Java 的內(nèi)存由 GC 管理。有2種情況,一種是內(nèi)存溢出了,一種是內(nèi)存沒有溢出,但 GC 不健康。

內(nèi)存溢出的情況可以通過加上 -XX:+HeapDumpOnOutOfMemoryError 參數(shù),該參數(shù)作用是:在程序內(nèi)存溢出時(shí)輸出 dump 文件。

有了 dump 文件,就可以通過 dump 分析工具進(jìn)行分析了,比如常用的MAT,Jprofile,jvisualvm 等工具都可以分析,這些工具都能夠看出到底是哪里溢出,哪里創(chuàng)建了大量的對(duì)象等等信息。

第二種情況就比較復(fù)雜了。GC 的健康問題。

通常一個(gè)健康的 GC 是什么狀態(tài)呢?根據(jù)樓主的經(jīng)驗(yàn),YGC 5秒一次左右,每次不超過50毫秒,F(xiàn)GC 最好沒有,CMS GC 一天一次左右。

而 GC 的優(yōu)化有2個(gè)維度,一是頻率,二是時(shí)長(zhǎng)。

我們看YGC,首先看頻率,如果 YGC 超過5秒一次,甚至更長(zhǎng),說明系統(tǒng)內(nèi)存過大,應(yīng)該縮小容量,如果頻率很高,說明 Eden 區(qū)過小,可以將 Eden 區(qū)增大,但整個(gè)新生代的容量應(yīng)該在堆的 30% - 40%之間,eden,from 和 to 的比例應(yīng)該在 8:1:1左右,這個(gè)比例可根據(jù)對(duì)象晉升的大小進(jìn)行調(diào)整。

如果 YGC 時(shí)間過長(zhǎng)呢?YGC 有2個(gè)過程,一個(gè)是掃描,一個(gè)是復(fù)制,通常掃描速度很快,復(fù)制速度相比而言要慢一些,如果每次都有大量對(duì)象要復(fù)制,就會(huì)將 STW 時(shí)間延長(zhǎng),還有一個(gè)情況就是 StringTable ,這個(gè)數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)著 String.intern 方法返回的常連池的引用,YGC 每次都會(huì)掃描這個(gè)數(shù)據(jù)結(jié)構(gòu)(HashTable),如果這個(gè)數(shù)據(jù)結(jié)構(gòu)很大,且沒有經(jīng)過 FGC,那么也會(huì)拉長(zhǎng) STW 時(shí)長(zhǎng),還有一種情況就是操作系統(tǒng)的虛擬內(nèi)存,當(dāng) GC 時(shí)正巧操作系統(tǒng)正在交換內(nèi)存,也會(huì)拉長(zhǎng) STW 時(shí)長(zhǎng)。

再來看看FGC,實(shí)際上,F(xiàn)GC 我們只能優(yōu)化頻率,無法優(yōu)化時(shí)長(zhǎng),因?yàn)檫@個(gè)時(shí)長(zhǎng)無法控制。如何優(yōu)化頻率呢?

首先,F(xiàn)GC 的原因有幾個(gè),1 是 Old 區(qū)內(nèi)存不夠,2 是元數(shù)據(jù)區(qū)內(nèi)存不夠,3 是 System.gc(), 4 是 jmap 或者 jcmd,5 是CMS Promotion failed 或者 concurrent mode failure,6 JVM 基于悲觀策略認(rèn)為這次 YGC 后 Old 區(qū)無法容納晉升的對(duì)象,因此取消 YGC,提前 FGC。

通常優(yōu)化的點(diǎn)是 Old 區(qū)內(nèi)存不夠?qū)е?FGC。如果 FGC 后還有大量對(duì)象,說明 Old 區(qū)過小,應(yīng)該擴(kuò)大 Old 區(qū),如果 FGC 后效果很好,說明 Old 區(qū)存在了大量短命的對(duì)象,優(yōu)化的點(diǎn)應(yīng)該是讓這些對(duì)象在新生代就被 YGC 掉,通常的做法是增大新生代,如果有大而短命的對(duì)象,通過參數(shù)設(shè)置對(duì)象的大小,不要讓這些對(duì)象進(jìn)入 Old 區(qū),還需要檢查晉升年齡是否過小。如果 YGC 后,有大量對(duì)象因?yàn)闊o法進(jìn)入 Survivor 區(qū)從而提前晉升,這時(shí)應(yīng)該增大 Survivor 區(qū),但不宜太大。

上面說的都是優(yōu)化的思路,我們也需要一些工具知道 GC 的狀況。

JDK 提供了很多的工具,比如 jmap ,jcmd 等,oracle 官方推薦使用 jcmd 代替 jmap,因?yàn)?jcmd 確實(shí)能代替 jmap 很多功能。jmap 可以打印對(duì)象的分布信息,可以 dump 文件,注意,jmap 和 jcmd dump 文件的時(shí)候會(huì)觸發(fā) FGC ,使用的時(shí)候注意場(chǎng)景。

還有一個(gè)比較常用的工具是 jstat,該工具可以查看GC 的詳細(xì)信息,比如eden ,from,to,old 等區(qū)域的內(nèi)存使用情況。

還有一個(gè)工具是 jinfo,該工具可以查看當(dāng)前 jvm 使用了哪些參數(shù),并且也可以在不停機(jī)的情況下修改參數(shù)。

包括我們上面說的一些分析 dump 文件的可視化工具,MAT,Jprofile,jvisualvm 等,這些工具可以分析 jmap dump 下來的文件,看看哪個(gè)對(duì)象使用的內(nèi)存較多,通常是能夠查出問題的。

還有很重要的一點(diǎn)就是,線上環(huán)境一定要帶上 GC 日志?。?!

“JVM線上故障排查的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

當(dāng)前標(biāo)題:JVM線上故障排查的方法
當(dāng)前網(wǎng)址:http://bm7419.com/article26/igchjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、動(dòng)態(tài)網(wǎng)站、服務(wù)器托管、定制網(wǎng)站ChatGPT、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)