Full GC 排查

在 Java 中,Full GC(完全垃圾回收)會對整個堆(包括年輕代和老年代,甚至可能包括永久代/元空間)進行垃圾回收,通常會導致較長的停頓(STW,Stop-The-World)。如果 Full GC 頻繁發生,可能會影響應用的性能,甚至導致 OOM(OutOfMemoryError)。以下是排查 Full GC 的方法和工具:

1. 啟用 GC 日志進行分析

(1)JDK 8 及以下版本

在 JVM 啟動參數中添加:

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log

解釋:

  • -XX:+PrintGCDetails:輸出 GC 詳細信息。
  • -XX:+PrintGCDateStamps:打印 GC 發生的時間戳。
  • -Xloggc:gc.log:指定 GC 日志文件。

GC 日志示例:

2025-02-28T10:00:00.123+0000: [Full GC (System.gc())  [PSYoungGen: 1024K->0K(2048K)] [ParOldGen: 4096K->1024K(8192K)], 0.2356780 secs] 

分析重點:

  • Full GC (System.gc()):說明 GC 是由 System.gc() 觸發的。
  • ParOldGen: 4096K->1024K(8192K):老年代的使用變化。
  • 0.2356780 secs:GC 停頓時間。

(2)JDK 9 及以上

JDK 9 引入了 統一日志框架(JEP 158),可以使用 -Xlog 進行更細粒度的 GC 日志控制:

-Xlog:gc*:file=gc.log:time,uptime,level,tags

示例:

[2025-02-28T10:00:00.123+0000][info][gc] GC(5) Pause Full (G1 Evacuation Pause) 235ms

2. 使用 jstat 監控 GC

jstat 是 JDK 自帶的工具,可以用來實時監控 GC 的情況。

(1)查看 GC 統計信息

jstat -gcutil <pid> 1000

示例輸出:

  S0     S1     E      O      M     CCS   YGC    YGCT   FGC   FGCT    GCT0.00  98.65  64.32  92.12  80.45  65.23   150  12.34   20   30.12  42.46

重點關注:

  • O(Old Gen):如果 O 長期接近 100%,說明老年代快滿了,可能會觸發 Full GC
  • FGC(Full GC 次數):如果這個值增長很快,說明 Full GC 頻繁發生。
  • FGCT(Full GC 耗時):觀察 Full GC 是否導致了長時間的 STW。

(2)查看具體 GC 詳細信息

jstat -gc <pid> 1000

可以看到 Eden、Survivor、Old 區域的內存變化,幫助判斷是否因老年代空間不足導致 Full GC

3. 使用 jmap 檢查堆內存

如果懷疑 Full GC 頻繁發生是由于內存不足,可以用 jmap 生成 堆轉儲文件(Heap Dump) 進行分析:

jmap -dump:format=b,file=heapdump.hprof <pid>

然后用 Eclipse MATVisualVM 分析內存使用情況,檢查是否有內存泄漏或對象無法回收的問題。

此外,可以使用:

jmap -histo <pid>

查看當前堆中的對象分布,重點關注大對象或數量異常的對象。

4. 使用 jconsoleVisualVM 監控

  • JConsole

    jconsole
    
    • 連接到目標 JVM 后,查看 “內存”(Memory) 選項卡,觀察老年代的占用情況。
    • 如果 Old Gen 長期接近 100%,可能會觸發 Full GC
  • VisualVM

    jvisualvm
    
    • 連接到目標進程,打開 “監視”(Monitor) 選項卡,觀察 GC 活動
    • 使用 “Profiler”(分析器) 記錄 GC 發生的時間和影響。

5. 檢查 Full GC 觸發原因

(1)老年代空間不足

  • 觀察老年代(Old Gen)占用情況,如果頻繁接近 100%,說明 Full GC 可能是由于老年代空間不足導致的。
  • 優化方案
    • 增大老年代:
      -Xmx4g -Xms4g
      
    • 調整 GC 算法(如 G1 或 ZGC):
      -XX:+UseG1GC
      
    • 調整老年代比例:
      -XX:NewRatio=2
      

(2)過多的 System.gc()

  • 某些代碼可能顯式調用了 System.gc(),強制觸發 Full GC
  • 檢查代碼是否有 System.gc() 調用,可以禁用:
    -XX:+DisableExplicitGC
    

(3)大對象直接進入老年代

  • 如果對象過大,可能會直接分配到老年代,導致 Full GC
  • 優化方案
    • 增大 -XX:PretenureSizeThreshold 以避免大對象直接進入老年代:
      -XX:PretenureSizeThreshold=16m
      
    • 使用 G1GC,可以通過 -XX:InitiatingHeapOccupancyPercent 控制老年代回收時機。

(4)元空間(Metaspace)不足

  • 在 JDK 8+,類元數據存放在 元空間(Metaspace),如果元空間不足也會觸發 Full GC
  • 優化方案
    • 增大元空間:
      -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g
      

6. 結論

快速排查 Full GC 的步驟

  1. 啟用 GC 日志-Xlog:gc*-XX:+PrintGCDetails)分析 Full GC 觸發原因。
  2. 使用 jstat -gcutil <pid> 1000 觀察老年代是否滿了。
  3. 使用 jmap -histo <pid>jmap -dump 分析堆對象,檢查是否有內存泄漏或大對象。
  4. 使用 jconsoleVisualVM 監控 GC 活動,觀察 Full GC 頻率。
  5. 檢查是否有 System.gc() 調用,可以通過 -XX:+DisableExplicitGC 禁用。
  6. 調整 JVM 參數,如 -Xmx, -XX:NewRatio, -XX:MetaspaceSize,或嘗試 G1/ZGC。

這樣可以快速找出 Full GC 發生的原因,并進行針對性的優化 🚀。

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

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

相關文章

go語言中字符串嵌套

在Go語言中&#xff0c;字符串嵌套通常是指在字符串中包含另一個字符串。可以通過以下幾種方式實現&#xff1a; 1. 使用雙引號和轉義字符 如果需要在字符串中嵌套雙引號&#xff0c;可以使用轉義字符 \ 來表示內部的雙引號。例如&#xff1a; s : "He said, \"He…

Docker 學習(二)——基于Registry、Harbor搭建私有倉庫

Docker倉庫是集中存儲和管理Docker鏡像的平臺&#xff0c;支持鏡像的上傳、下載、版本管理等功能。 一、Docker倉庫分類 1.公有倉庫 Docker Hub&#xff1a;官方默認公共倉庫&#xff0c;提供超過10萬鏡像&#xff0c;支持用戶上傳和管理鏡像。 第三方平臺&#xff1a;如阿里…

js的簡單介紹

一.javascript&#xff08;是什么&#xff09; 是一種運行在客戶端(瀏覽器)的編程語言&#xff0c;實現人機交互效果 作用 網頁特效&#xff08;監聽客戶的一些行為讓網頁做出對應的反饋&#xff09;表單驗證(針對表格數據的合法性進行判斷)數據交互(獲取后臺的數據&#xf…

k8s架構及服務詳解

目錄 1.1.容器是什么1.2.Namespace1.3.rootfs5.1.Service介紹5.1.1.Serice簡介 5.1.1.1什么是Service5.1.1.2.Service的創建5.1.1.3.檢測服務5.1.1.4.在運行的容器中遠程執行命令 5.2.連接集群外部的服務 5.2.1.介紹服務endpoint5.2.2.手動配置服務的endpoint5.2.3.為外部服務…

01. HarmonyOS應用開發實踐與技術解析

文章目錄 前言項目概述HarmonyOS應用架構項目結構Ability生命周期 ArkTS語言特性裝飾器狀態管理 UI組件與布局基礎組件響應式布局樣式與主題 頁面路由與參數傳遞頁面跳轉參數接收 數據綁定與循環渲染數據接口定義循環渲染 條件渲染組件生命周期最佳實踐與性能優化組件復用響應式…

【虛擬機 IP 配置深度剖析】

虛擬機 IP 配置深度剖析 在虛擬機的使用過程中&#xff0c;IP 配置猶如搭建房屋的基石&#xff0c;是確保虛擬機與外部網絡順暢通信、與其他設備高效交互的關鍵所在。本文將以 CentOS 虛擬機為例&#xff0c;深入解讀 IP 配置的奧秘。 一、認識網絡模式 ? NAT 模式&#xf…

【Python 數據結構 5.棧】

目錄 一、棧的基本概念 1.棧的概念 2.入棧 入棧的步驟 3.出棧 出棧的步驟 4.獲取棧頂元素 獲取棧頂元素的步驟 二、 Python中的棧 順序表實現 鏈表實現 三、棧的實戰 1.LCR 123. 圖書整理 I 思路與算法 2.LCR 027. 回文鏈表 思路與算法 3.1614. 括號的最大嵌套深度 思路與算法 …

Machine Learning 初探

前置知識 pandas 讀取文件&#xff1a;read_csv查看信息 describe&#xff1a;查看整體信息&#xff0c;包括每列的平均值、最大最小值、標準差等head&#xff1a;輸出頭部幾行數據columns&#xff1a;輸出所有列名loc&#xff1a;查詢數據&#xff0c;或是根據索引取對應的數…

2025年2月個人工作生活總結

本文為 2025年2月工作生活總結。 工作記錄 AI浪潮 AI非常火&#xff0c;春節至今&#xff0c;到處充斥著大量和AI、DeepSeek有關的新聞。領導也一再強調要用AI&#xff0c;甚至納入到新一年的考核里。再往上&#xff0c;大領導開會的新聞稿里也作出要求&#xff0c;不能停下腳…

SpringBoot @ConfigurationProperties 注解使用

ConfigurationProperties 用于將配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的屬性批量綁定到一個 Java Bean 中。 1. 定義配置文件 在 application.properties 或 application.yml 中定義一組具有相同前綴的屬性。 application.yml &a…

剛安裝docker并啟動docker服務: systemctl restart docker報錯解決

root:/home/lzw# sudo systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xeu docker.service" for details. 1、問題描述 啟動doc…

JavaScript的this指向,一次徹底講清楚

JavaScript 中的 this 指向是一個非常重要且容易混淆的概念。它的值取決于函數被調用的上下文,而不是函數定義的位置。以下是 this 指向的詳細解析: 1. 默認綁定(Default Binding) 在非嚴格模式下,如果函數是直接調用(而不是作為對象的方法或構造函數等),this 默認指向…

MFC: 控件根據文本內容大小自動調整

背景&#xff1a; 針對不同語言下&#xff0c;控件顯示不全的現象&#xff1b; 例如&#xff1a; 現象1&#xff1a;中文下顯示全部信息&#xff0c;英語下只能顯示部分文字 現象2&#xff1a;中文下顯示不全## 實現思路&#xff1a; 控件綁定按鈕計算控件文本長度根據文本長…

SpringBoot 整合mongoDB并自定義連接池,實現多數據源配置

要想在同一個springboot項目中使用多個數據源&#xff0c;最主要是每個數據源都有自己的mongoTemplate和MongoDbFactory。mongoTemplate和MongoDbFactory是負責對數據源進行交互的并管理鏈接的。 spring提供了一個注解EnableMongoRepositories 用來注釋在某些路徑下的MongoRepo…

軟件測試中的BUG

文章目錄 軟件測試的生命周期BugBug 的概念描述 Bug 的要素案例Bug 級別Bug 的生命周期與開發產生爭執怎么辦&#xff1f;【高頻面試題】先檢查自身&#xff0c;Bug 是否描述的不清楚站在用戶角度考慮并拋出問題Bug 的定級要有理有據提?自身技術和業務水平&#xff0c;做到不僅…

泵吸式激光可燃氣體監測儀:快速精準守護燃氣管網安全

在城市化進程加速的今天&#xff0c;燃氣泄漏、地下管網老化等問題時刻威脅著城市安全。如何實現精準、高效的可燃氣體監測&#xff0c;守護“城市生命線”&#xff0c;成為新型基礎設施建設的核心課題。泵吸式激光可燃氣體監測儀&#xff0c;以創新科技賦能安全監測&#xff0…

第J3-1周:DenseNet算法 實現乳腺癌識別

文章目錄 一、前言二、前期準備1.設置GPU2.劃分數據集 三、搭建網絡模型1.DenseLayer模塊2.DenseBlock模塊3.Transition模塊4.構建DenseNet5.構建densenet121 四、訓練模型1.編寫訓練函數2.編寫測試函數3.正式訓練 五、結果可視化1.Loss與Accuracy圖2.模型評估 總結&#xff1a…

【JAVA面試題】== 和 equals() 的區別與使用場景

在 Java 面試中&#xff0c; 和 equals() 的區別是一個高頻考點。理解它們的底層原理和使用場景&#xff0c;對于掌握 Java 基礎知識至關重要。本文將從 基本概念、底層實現 和 實際應用 三個方面&#xff0c;深入解析 和 equals() 的區別。 1. 基本概念 1.1 運算符 作用&a…

-bash: lsof: command not found

一、問題說明 執行如下命令時報錯&#xff1a; # lsof |grep deleted > deleted_file -bash: lsof: command not found二、處理方法 # yum -y install lsof安裝完成后可成功執行上面的命令。

攝像頭應用編程(三):多平面視頻采集

文章目錄 1、前言2、環境介紹3、步驟4、應用程序編寫5、測試5.1、編譯應用程序5.2、運行應用程序 6、總結 1、前言 在查看攝像頭類型時&#xff0c;大致可以分為兩類&#xff1a;Video Capture 和 Video Capture Multiplanar。 本次應用程序主要針對類型為Video Capture Multi…