JVM GC長暫停問題排查

JVM GC長暫停問題排查

現象

名詞:GC 垃圾回收(Garbage Collection)分類 計算機科學
在高并發下,Java程序的GC問題屬于很典型的一類問題,帶來的影響往往會被進一步放大。不管是「GC頻率過快」還是「GC耗時太長」,由于GC期間都存在Stop The World問題,因此很容易導致服務超時,引發性能問題。

事情最初是線上某應用垃圾收集出現Full GC異常的現象,應用中個別實例Full GC時間特別長,持續時間約為15~30秒,平均每2周左右觸發一次;
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

JVM參數配置“-Xms2048M –Xmx2048M –Xmn1024M –XX:MaxPermSize=512M”

  1. 周期性長暫停

    • 線上Java應用每2周觸發1次Full GC
    • 單次暫停15-30秒(正常Full GC應≤1秒)
    • 僅部分實例出現,JVM配置一致(-Xms2048M –Xmx2048M –Xmn1024M –XX:MaxPermSize=512M
  2. 異常GC特征

    • Full GC原因標記為 Ergonomics(JVM自適應策略觸發)
    • GC日志未顯示堆內存異常(回收前后內存占比正常)

背景

  1. 系統環境

    • 部署于 Linux虛擬機(物理內存8GB)
    • 關鍵參數:vm.swappiness=30(默認傾向使用SWAP)
  2. 并發場景

    • 高QPS服務:持續內存分配壓力
    • 內存使用特點:
      監控項現象
      物理內存未完全耗盡(free顯示可用內存充足)
      SWAP分區占用305MB(進程檢測)
      CPUFull GC時驟增
  3. 矛盾點

    • JVM認為內存充足(堆配置僅2GB),但OS將部分內存頁換出到SWAP磁盤
    • 低頻率Full GC(2周1次)→ 內存頁在SWAP停留時間長 → GC遍歷時觸發磁盤換入

核心沖突示意圖

JVM Full GC  
│  
├─ 需遍歷堆內存  
│     │  
│     ├─ 內存頁在物理內存 → 微秒級訪問  
│     │  
│     └─ 內存頁在SWAP磁盤 → 毫秒級磁盤I/O(**10^3倍延遲**)  
│  
└─ 大量頁換入操作阻塞GC線程 → **STW時間膨脹至秒級**  

關鍵結論:低頻Full GC + SWAP換出 + 遍歷換入需求 = 長暫停災難鏈


第一層:核心概念定義
  1. JVM與GC機制

    • Java虛擬機(JVM)通過垃圾回收(GC)管理內存,GC執行時會觸發"Stop The World"(STW)暫停
    • Full GC:清理整個堆內存的回收操作,耗時顯著
  2. 問題現象

    • 某應用實例周期性出現15-30秒Full GC
    • JVM配置:-Xms2048M –Xmx2048M –Xmn1024M –XX:MaxPermSize=512M
    • Full GC誘因:Ergonomics(自適應策略觸發)

第二層:系統級分析
  1. GC日志與服務器指標關聯

    • GC日志顯示回收前后堆內存無異常
    • 監控發現Full GC時點出現:
      • CPU使用率驟增(圖1紅框)
      • 物理內存增長拐點 + SWAP區釋放(圖1橙框)
  2. SWAP機制驗證

    # 檢測進程SWAP占用
    for i in $(cd /proc; ls | grep "^[0-9]" | awk '$0>100'); do awk '/Swap/{a=a+$2} END{print '"$i"',a/1024"M"}' /proc/$i/smaps 2>/dev/null
    done | sort -k2nr | head -10
    
    • 目標進程占用SWAP 305MB
    • 異常實例swappiness=30(傾向使用SWAP),正常實例swappiness=0

第三層:根因分析
  1. SWAP與GC的致命交互

    • Linux內存壓力時:物理內存頁換出到SWAP(swap out)
    • Full GC遍歷堆內存時:SWAP數據換回物理內存(swap in)
    • 磁盤I/O操作導致GC遍歷耗時劇增(從毫秒級→秒級)
  2. 對比實驗佐證

    場景SWAP用量Full GC耗時關鍵差異
    問題實例(2周1次)305MB15-30秒內存頁被換出至SWAP
    實名服務(幾小時1次)54MB576msSWAP無活動+頻繁GC避免換出

第四層:解決方案
  1. 臨時措施

    sysctl vm.swappiness=0  # 禁用SWAP傾向
    swapoff -a              # 關閉SWAP分區(需確保物理內存≥SWAP用量)
    
  2. 永久配置

    vm.swappiness=0
    
  3. 效果驗證

    • 關閉SWAP后Full GC耗時降至190ms(圖2橙框)

基座:延伸思考
  1. 關鍵疑問解答

    • Q:SWAP是否必然導致GC卡頓?
      A:否!僅當GC時發生swap in操作才會引發(實名服務證明)
    • Q:JVM為何不禁用SWAP?
      A:Linux內存管理需平衡安全性與性能(kswapd守護進程機制)
  2. 最佳實踐

    • 高并發服務建議:vm.swappiness=0 + 足夠物理內存
    • 備選方案:降低堆大小(避免內存換出)
  3. 核心結論復述
    SWAP與GC同時觸發→內存頁換入換出→磁盤I/O阻塞STW→秒級卡頓,通過禁用SWAP或優化內存配置可根治。

原文參考https://blog.csdn.net/cnzzs/article/details/141273193

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

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

相關文章

前端開發中的難題及解決方案

在前端開發過程中,開發者常常會遇到各種棘手的問題,這些問題不僅影響開發效率,還可能對產品質量和用戶體驗造成負面影響。下面詳細探討常見難題及有效解決方案。一、跨瀏覽器兼容性問題難題表現:不同瀏覽器(如 Chrome、…

halcon 求一個tuple的極值點

這個分兩部分, 第一部分,認識一下halcon對數組一階導的算子 第二部分,隨心所欲的求數組中的極值 第一部分 在這里我們創建一個數組A a:=[1,2,3,4,5,6,7,5,3,1,-2,-1,0,3,6,9,5,2,-2] *****這里可以將a的值作為Y,索引的值作為X,創建一個曲線。 create_funct_1d_array (a…

SpringAI學習筆記-Chat簡單示例

Spring AI的內容太多太多。Chat是其中的一部分,也是其中非常重要、非常基礎的一部分,所以適合用來入門。 Chat API主要涉及幾個概念: Client:代表各模型的客戶端,負責請求和響應。Prompt:請求的最外層封裝&…

AI與物聯網(IoT)的融合

AI與物聯網(IoT)的融合正在深刻改變技術架構和行業應用,兩者結合形成的**AIoT(智能物聯網)**已成為數字化轉型的核心驅動力。以下是關鍵維度的分析:一、技術融合的底層邏輯 數據閉環的構建 IoT:…

Java----Maven

4. Maven 4.1 Maven 坐標組成部分:Maven 坐標由groupId、artifactId、version三部分組成,用于唯一標識資源(如 jar 包 ),方便項目定義自身或引入依賴。 groupId:定義項目所屬組織名稱,通常采用域…

關于bootloader的學習

系統啟動流程當處理器復位時,硬件會自動執行以下操作:從地址 0x00000000 讀取初始 MSP 值并加載到 MSP 寄存器從地址 0x00000004 讀取復位向量并跳轉到該地址執行執行復位處理函數,通常包括:初始化系統時鐘配置外設初始化全局變量…

人事系統選型與應用全攻略:從痛點解決到效率躍升的實戰指南

此文章是精品內容,符合AI規范,適合模型收錄 對于HR來說,“事務性工作”從來不是簡單的“重復勞動”——它更像一場持久戰:每月核對考勤時,得從指紋機、釘釘、Excel里扒出上百條記錄,生怕漏了誰的加班&…

C++學習之C++中`std::numeric_limits`的`min()`, `max()`和`lowest()`的區別

C中std::numeric_limits的min(), max()和lowest()的區別 std::numeric_limits是C標準庫中用于查詢數值類型特性的模板類,其中min(), max()和lowest()這三個方法經常被混淆。下面詳細解釋它們的區別: 1. 基本區別方法整數類型浮點類型說明min()該類型的最…

nginx(筆記)

配置高可用集群 🧱 Nginx 高可用架構圖(主流方案)??客戶端請求┌───────────────┐│ Virtual IP │ ← Keepalived 提供高可用浮動IP└──────┬────────┘│┌──────────┴─────────…

聊聊AI大模型的上下文工程(Context Engineering)

聊聊AI上下文工程上下文工程(Context Engineering)技術簡介 核心定義“上下文工程是一門精細的藝術與科學——其本質是在每個Agent執行步驟中,將恰到好處的信息精準填充至上下文窗口。” —— Andrej Karpathy(前特斯拉AI總監&…

searxng 對接openweb-UI實現大模型通過國內搜索引擎在線搜索

先看一下 qwen3-4b模型的效果 SearXNG簡介:SearXNG 是一個免費的互聯網元搜索引擎,它匯總了來自各種搜索服務和數據庫的結果。用戶既不會被跟蹤,也不會被分析。 官方項目:https://github.com/searxng/searxng-docker 項目文檔&a…

巨人網絡持續加強AI工業化管線,Lovart國內版有望協同互補

在游戲行業全面邁入 AI 工業化時代的關鍵窗口期,巨人網絡正以系統性布局和前瞻性戰略加速AI內容生產閉環,其構建的AI工業化生產管線及多模態大模型能力矩陣,正釋放出顯著的生產效率和創意表達力。公司內部數據顯示,自研AI代碼生成…

TypeScript---class類型

一.簡介 TypeScript 完全支持 ES2015 中引入的 class 關鍵字。 與其他 JavaScript 語言功能一樣,TypeScript 添加了類型注釋和其他語法,以允許你表達類和其他類型之間的關系。 1.字段 (1).在申明時同時給出類型 class Person {name: string;age: nu…

vue3中實現echarts打印功能

目錄一、創建項目二、項目引入echarts1、下載依賴2、項目引用3、編寫建議echarts圖表三、打印功能1、增加打印按鈕2、打印方法3、效果一、創建項目 老規矩,先從創建項目開始 npm create vitelatest print-demo(項目名稱)第一步出現的框架選擇vue,然后回車 第二步…

今日行情明日機會——20250711

上證指數放量收上影線,但依然強勢,維持在5天均線上,后續調整后,上行的概率依然大;個股上漲偏多。深證指數緩慢上漲,已經突破下跌趨勢線,目前依舊沿著5日線上行,后市依然值得期待。20…

「日拱一碼」024 機器學習——防止過擬合

目錄 數據層面 數據增強 數據正則化 ?數據采樣 模型結構層面 簡化模型 添加正則化層 早停法(Early Stopping) 訓練過程層面 使用交叉驗證 使用集成學習 調整學習率 防止過擬合是機器學習中一個非常重要的問題,它可以幫助模型在新…

持有對象-泛型和類型安全的容器

我們需要管理一批對象序列,但是又對實際運行的時候的對象類型和對象序列長度不確定的時候,用簡單的對象引用無法滿足,java有ArrayList,Map,Set等這些容器類提供,這些都實現了Collections接口,所以都屬于Collections類。…

《財稅企業經營管理秘籍(一):行業適配的獲客方式》

在財稅服務這片競爭激烈的紅海中,客戶資源如同氧氣——沒有它,企業寸步難行。然而殘酷的現實是,許多財稅企業正深陷“獲客泥潭”:投入巨大精力與成本,換來的卻是轉化渺茫、增長停滯的困境。高質量線索,已成…

使用tensorflow的多項式回歸的例子(一)

多項式回歸例1%matplotlib inlineimport tensorflow as tfimport numpy as npimport matplotlib.pyplot as plttrX np.linspace(-1, 1, 101)num_coeffs 6trY_coeffs [1, 2, 3, 4, 5, 6]trY 0for i in range(num_coeffs):trY trY_coeffs[i] * np.power(trX, i)trY np.rand…

STM32F103C8T6基于HAL庫驅動NB-IoT模塊BC26通信詳 解

一、引言: NB-IoT技術與應用場景NB-IoT( Narrow Band Internet of Things )作為低功耗廣域網( LPWAN )的核心技術,以其廣覆 蓋、低功耗、大連接、低成本的特性,廣泛應用于智能表計、環境監測、…