【實戰場景】記一次UAT jvm故障排查經歷

【實戰場景】記一次UAT jvm故障排查經歷

  • 開篇詞:
  • 干貨篇:
      • 1.查看系統資源使用情況
      • 2.將十進制進程號轉成十六進制
      • 3.使用jstack工具監視進程的垃圾回收情況
      • 4.輸出指定線程的堆內存信息
      • 5.觀察日志
      • 6.本地環境復現
  • 總結篇:
  • 我是杰叔叔,一名滬漂的碼農,下期再會!

開篇詞:

故障背景是客服中心通話歷史分表4季度,單表200w+,查詢一年的數據量,大分頁(查詢第20w頁的10條數據)查詢多次,tomcat卡死,一段時間后,后臺其他定時任務,kafaka消費線程恢復正常,tomcat web容器依舊高cpu,具卡無比。

干貨篇:

1.查看系統資源使用情況

top -H -p 49339
解釋:查看進程49339進程的實時系統資源使用情況,“-H”表示查看進程中所有線程資源占用情況; “-p”指用來指定具體進程號

2.將十進制進程號轉成十六進制

printf “%x \n” 49339
解釋:轉換的目的是讓這個線程ID能和jstack輸出的線程ID匹配上,因為jstack輸出的是十六進制的線程ID

3.使用jstack工具監視進程的垃圾回收情況

jstat -gc 49339 3 5
解釋:通過jstat工具查看jvm 垃圾回收情況,“-gc”指定要監視的內容為垃圾回收情況;“3”每隔三秒輸出一次監視結果;“5”一共輸出5次監視結果。
在這里插入圖片描述

其中各參數代表的含義:

  • S0C (Survivor space 0 capacity):第一個幸存區(Survivor space)的容量(以字節為單位)。幸存區用于存放垃圾收集后存活的對象。
  • S1C (Survivor space 1 capacity):第二個幸存區的容量(以字節為單位)。在大多數 JVM 實現中,幸存區有兩個,用于在不同的垃圾收集周期之間切換。
  • S0U (Survivor space 0 utilization):第一個幸存區當前已使用的空間大小(以字節為單位)。
  • S1U (Survivor space 1 utilization):第二個幸存區當前已使用的空間大小(以字節為單位)。
  • EC (Eden space capacity):Eden 區的容量(以字節為單位)。Eden 區是 Java 堆的一部分,用于存放新生成的對象。
  • EU (Eden space utilization):Eden 區當前已使用的空間大小(以字節為單位)。
  • OC (Old space capacity):老年代(Old Generation)的容量(以字節為單位)。老年代用于存放存活時間較長的對象。
  • OU (Old space utilization):老年代當前已使用的空間大小(以字節為單位)。
  • MC (Metaspace capacity):元空間(Metaspace,Java 8 引入以替代永久代)的容量(以字節為單位)。元空間用于存放類的元數據。
  • MU (Metaspace utilization):元空間當前已使用的空間大小(以字節為單位)。
  • CCSC (Compressed class space capacity):壓縮類空間(Java 8+ 中使用)的容量(以字節為單位)。這個空間用于存放類的元數據,但與元空間分開管理。
  • CCSU (Compressed class space utilization):壓縮類空間當前已使用的空間大小(以字節為單位)。
  • YGC (Young GC count):年輕代垃圾收集的次數。
  • YGCT (Young GC time):年輕代垃圾收集所花費的總時間(以秒為單位)。
  • FGC (Full GC count):完全垃圾收集(Full GC,也稱作老年代垃圾收集)的次數。
  • FGCT (Full GC time):完全垃圾收集所花費的總時間(以秒為單位)。
  • GCT (Total GC time):垃圾收集所花費的總時間(以秒為單位),包括年輕代和完全垃圾收集的時間。
    請注意,具體的輸出參數可能會因 JVM 的版本和配置(如是否啟用了壓縮指針等)而有所不同。此外,對于 JDK 11 及更高版本,元空間(Metaspace)取代了永久代(PermGen space),因此相關的參數(如 PC 和 PU)在較新版本的 JVM 中不再出現。

4.輸出指定線程的堆內存信息

jmap -heap 49339
解釋:輸出指定線程的堆內存信息
在這里插入圖片描述

jstack -l 49339|grep c22a -A 20
解釋:時候用jstack工具來輸出java進程的線程堆棧信息,并查找包含字符串“c22a”的行,打印其后面的20行
“-l”:指定輸出java進程的線程ID;“-A 20”:打印匹配行及其后面的20行

5.觀察日志

發現kafka消費線程占用cpu較高,kafka consumer正常epollWait等待kafaka數據,無其他特別異常信息,暫時跳過

6.本地環境復現

更換jdbc連接池至druid,通過dashboard排查分表后的真實sql耗時,中等數據量時,由于分表的存在,limit 20w,20w+10會被重寫0,20W+10,以便跨表數據內存排序,數據量大,便造成了慢查詢,有可能導致OOM

總結篇:

以下是大致的排查JVM問題的思路:

  1. 初步觀察和監控
    查看系統指標:使用系統監控工具(如Linux的top命令或Windows的任務管理器)查看CPU、內存和網絡IO等關鍵指標。
    觀察JVM監控工具:使用JDK自帶的工具如jConsole、VisualVM或第三方工具(如Arthas)來遠程連接并監控JVM的內存使用趨勢、線程狀態、垃圾回收活動等。
  2. 確定問題類型
    內存問題:觀察是否出現OutOfMemoryError(OOM)錯誤,或者內存使用量異常增長。
    CPU問題:查看CPU使用率是否過高,特別是某個或某些Java線程的CPU占用率異常。
    線程問題:檢查是否存在死鎖、線程饑餓或線程阻塞等問題。
    垃圾回收問題:分析垃圾回收日志,查看垃圾回收的頻率、時間和類型,判斷是否存在頻繁的Full GC或GC時間過長等問題。
  3. 使用診斷工具
    jstack:用于打印Java線程的堆棧跟蹤信息,幫助定位線程問題,如死鎖、線程阻塞等。
    示例命令:jstack ,其中是Java進程的進程ID。
    jmap:用于生成堆內存快照和查詢堆內存使用情況。
    示例命令:jmap -heap 查看堆內存使用情況,jmap -dump:live,format=b,file=.hprof 生成堆內存快照。
    jstat:用于監視JVM中類的加載、內存、垃圾收集、JIT編譯等運行時數據。
    示例命令:jstat -gc 1000每1000毫秒打印一次GC信息。
    jcmd(JDK 1.8+):集成了多個JDK診斷命令的功能,用于執行更復雜的診斷任務。
    示例命令:jcmd Thread.print打印線程信息。
  4. 分析日志和堆內存快照
    分析GC日志:通過GC日志分析垃圾回收的頻率、時間、類型和原因,判斷是否存在內存泄漏、堆內存設置不合理等問題。
    分析堆內存快照:使用MAT(Memory Analyzer Tool)等內存分析工具分析堆內存快照,查找內存泄漏的源頭、大對象占用等。
    查看應用程序日志:檢查應用程序日志以獲取更多關于錯誤和異常的上下文信息。
  5. 定位和解決問題
    代碼優化:根據分析結果優化代碼,減少內存占用、避免內存泄漏、優化數據結構等。
    JVM參數調整:調整JVM啟動參數,如堆內存大小(-Xms,-Xmx)、垃圾回收器類型(-XX:+UseG1GC)等,以改善JVM性能。
    升級JDK版本:如果問題是由于JDK的已知bug引起的,考慮升級到更高版本的JDK。
  6. 驗證和監控
    驗證修復:在開發或測試環境中驗證修復是否有效,確保問題得到解決。
    持續監控:在問題解決后,持續監控系統性能,確保沒有新的問題出現。

通過以上步驟,可以系統地排查和解決JVM問題,提高系統的穩定性和性能。需要注意的是,排查JVM問題可能需要一定的經驗和耐心,因為問題可能由多種因素引起,需要綜合考慮各種信息來找到問題的根源。

在這里插入圖片描述

我是杰叔叔,一名滬漂的碼農,下期再會!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38609.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線下促銷折扣視頻介紹

千呼新零售2.0系統是零售行業連鎖店一體化收銀系統,包括線下收銀線上商城連鎖店管理ERP管理商品管理供應商管理會員營銷等功能為一體,線上線下數據全部打通。 適用于商超、便利店、水果、生鮮、母嬰、服裝、零食、百貨、寵物等連鎖店使用。 詳細介紹請…

Linux上systemctl 和 service 兩個命令的區別和聯系

systemctl 和 service 兩個命令都是 Linux 系統中用于管理服務的工具,但它們分別關聯著不同的初始化系統(init system),并且在功能和使用場景上有所差異。 service 命令 關聯的初始化系統:service 命令通常與 SysV i…

Python從零學習筆記(1)

1pip無法調用 剛入python,需要用到第三方模塊,但是按照教程使用>>>pip install 總是出現錯誤提示 網上查詢許久:語句沒錯;安裝沒錯;環境配置也正常 最后才知道是不能先進入python模式,而是使用p…

2024年道路運輸安全員考試題庫及答案

一、多選題 11.《放射性物品安全管理條例》規定,運輸放射性物品時,應當使用專用的放射性物品運輸包裝容器。在運輸過程中正確的做法有( )。 A.托運人和承運人應當按照國家放射性物品運輸安全標準和國家有關規定,在…

什么是定時器?

前言👀~ 上一章我們介紹了阻塞隊列以及生產者消息模式,今天我們來講講定時器 定時器 標準庫中的定時器 schedule()方法 掃描線程 手動實現定時器 任務類 存儲任務的數據結構 定時器類 如果各位對文章的內容感興趣的話,請點點小贊&am…

【Python】列表

目錄 一、列表的概念 二、列表的創建 1.變量名 [ ] ..... 2.通過Python內置 的I ist類的構造函數來創建列表 三、操作列表元素的方法 1. 修改 2. 增加元素 3. 刪除 4. 其他操作 四、遍歷列表 五、列表排序 六、列表切片(list slicing) 七、…

淺談什么是計算機科學與技術(Computer Science,CS)

計算機科學的核心內容 計算機科學(Computer Science, CS)涵蓋了以下主要領域: 硬件:涉及數字電路、集成電路、存儲器和硬件設計與驗證方法等。 例子:學習如何設計和實現一個簡單的CPU,包括理解指令集、時鐘…

值得細讀的8個視覺大模型生成式預訓練方法

作者:vasgaowei(已授權原創) 編輯: AI生成未來 鏈接:https://zhuanlan.zhihu.com/p/677794719 大語言模型的進展催生出了ChatGPT這樣的應用,讓大家對“第四次工業革命”和“AGI”的來臨有了一些期待,也作為…

Linux基礎指令介紹與詳解——原理學習

前言:本節內容標題雖然為指令,但是并不只是講指令, 更多的是和指令相關的一些原理性的東西。 如果友友只想要查一查某個指令的用法, 很抱歉, 本節不是那種帶有字典性質的文章。但是如果友友是想要來學習的,…

[ALSA]從零開始,使用ALSA驅動播放一個音頻

前言 最近學了不少有關音頻相關的,最近搞一下ALSA驅動 安裝 參考Linux應用開發【第八章】ALSA應用開發 中提到的ALSA庫及工具章節,本文中有比較詳細的有關ALSA驅動引用程序怎么安裝的,這里不再贅述。 關于ALSA,就當成一個音頻…

深入淺出:npm常用命令詳解與實踐【保姆級教程】

大家好,我是CodeQi! 在我剛開始學習前端開發的時候,有一件事情讓我特別頭疼:管理和安裝各種各樣的依賴包。 那時候,我還不知道 npm 的存在,手動下載和管理這些庫簡直是噩夢。 后來,我終于接觸到了 npm(Node Package Manager),它不僅幫我解決了依賴管理問題,還讓我…

Python深度理解系列之【排序算法——冒泡排序】

讀者大大們好呀!!!?????? 👀期待大大的關注哦?????? 🚀歡迎收看我的主頁文章??木道尋的主頁 文章目錄 🔥前言🚀冒泡排序python實現算法實現圖形化算法展示 ??????總結 🔥前…

Apache POI、EasyPoi、EasyExcel

目錄 ?編輯 (一)Apache PoI 使用 (二)EasyPoi使用 (三)EasyExcel使用 寫 讀 最簡單的讀? 最簡單的讀的excel示例? 最簡單的讀的對象? (一)Apache PoI 使用 (二&…

golang go-bindata打包配置文件嵌入到二進制文件

go-bindata打包配置文件嵌入到二進制文件 項目中難免會用到一些靜態資源和配置文件,但是常規打包的二進制文件無法再其他目錄正常運行(靜態資源和配置文件不存在) 有類似需求的可以安裝使用:go-bindata進行編譯處理配置文件 go-bi…

train_encoder_decoder.py

train_encoder_decoder.py from __future__ import print_function #為了確保代碼同時兼容Python 2和Python 3版本中的print函數# 導入標準庫和第三方庫 import os.path #導入了Python的os.path模塊,用于處理文件和目錄路徑 from os import path #從os模塊中導入了…

【場景題】數據庫優化和接口優化——異步思想

理解 異步處理: 對于耗時的操作,可以考慮使用異步處理方式來提升接口的響應速度。用戶可以在不阻塞當前操作的情況下,等待異步操作的結果。 異步處理在數據庫優化中的應用 雖然數據庫操作本身(如查詢、插入、更新等&#xff09…

Git 安裝

目錄 Git 安裝 Git 安裝 在使用 Git 前我們需要先安裝 Git。Git 目前支持 Linux/Unix、Solaris、Mac 和 Windows 平臺上運行。Git 各平臺安裝包下載地址為:http://git-scm.com/downloads 在 Linux 平臺上安裝(包管理工具安裝) 首先&#xff0…

IIS在Windows上的搭建

📑打牌 : da pai ge的個人主頁 🌤?個人專欄 : da pai ge的博客專欄 ??寶劍鋒從磨礪出,梅花香自苦寒來 目錄 一 概念: 二網絡…

深入理解C++中的鎖

目錄 1.基本互斥鎖(std::mutex) 2.遞歸互斥鎖(std::recursive_mutex) 3.帶超時機制的互斥鎖(std::timed_mutex) 4.帶超時機制的遞歸互斥鎖(std::recursive_timed_mutex) 5.共享…

【python腳本】批量檢測sql延時注入

文章目錄 前言批量檢測sql延時注入工作原理腳本演示 前言 SQL延時注入是一種在Web應用程序中利用SQL注入漏洞的技術,當傳統的基于錯誤信息或數據回顯的注入方法不可行時,例如當Web應用進行了安全配置,不顯示任何錯誤信息或敏感數據時&#x…