JVM相關 4|JVM調優與常見參數(如 -Xms、-Xmx、-XX:+PrintGCDetails) 的必會知識點匯總

目錄:

  • 🧠 一、JVM調優目標
    • 1. 調優核心目標
    • 2. 調優常見問題
  • 🧩 二、JVM調優核心參數詳解
    • 1. 堆內存相關參數
    • 2. 垃圾回收器相關參數
    • 3. GC日志與性能監控
    • 4. 元空間(Metaspace)調優
    • 5. 棧內存調優
    • 6. 其他關鍵參數
  • 📌 三、調優策略與最佳實踐
    • 1. 堆內存調優
    • 2. 垃圾收集器選擇
    • v3. GC日志分析
    • 4. OOM問題定位與解決
  • 🧱 四、JVM調優步驟與流程
    • 1. 調優流程
    • 2. 常用調優工具
    • 3. 調優常用命令
  • 📊 五、常見JVM調優場景與解決方案
    • 1. 頻繁Full GC
    • 2. 內存泄漏
    • 3. 棧溢出(StackOverflowError)
    • 4. 元空間溢出(Metaspace OOM)
  • 🧪 六、常見JVM調優面試題及答案
    • 1. -Xms 和 -Xmx 的作用?
    • 2. -XX:NewRatio=2 和 -XX:SurvivorRatio=8 的含義?
    • 3. 如何選擇合適的GC收集器?
    • 4. -XX:+PrintGCDetails 和 -Xloggc 的作用?
    • 5. 如何避免頻繁Full GC?
    • 6. 如何分析GC日志?
    • 7. 如何定位內存泄漏?
  • ? 七、JVM調優核心知識點總結
  • 📋 八、完整JVM調優參數示例(生產環境推薦)**
  • 📄 九、完整GC日志示例(G1收集器)**
  • 📌 十、調優實踐建議
  • 📚 十一、推薦學習資料
  • 📄 十二、完整代碼示例(內存溢出場景)**
  • 📌 十三、JVM調優實戰建議
  • ? 十四、總結:JVM調優核心知識點

🧠 一、JVM調優目標

1. 調優核心目標

目標說明
吞吐量(Throughput)單位時間內處理的任務數量(適合后臺計算任務)。
停頓時間(Pause Time)每次GC暫停的時間(適合Web服務、低延遲場景)。
內存占用(Footprint)堆內存使用量(適合內存敏感場景)。

2. 調優常見問題

  • 內存泄漏(Memory Leak):對象不再使用但無法被GC回收。
  • 內存溢出(OutOfMemoryError):堆、棧、元空間等內存不足。
  • 頻繁Full GC:老年代頻繁觸發Full GC,導致性能下降。
  • GC停頓過長:GC時間過長影響業務響應。

🧩 二、JVM調優核心參數詳解

1. 堆內存相關參數

參數說明示例
-Xms初始堆大小(默認物理內存的1/64)-Xms512m
-Xmx最大堆大小(默認物理內存的1/4)-Xmx2g
-XX:NewSize新生代初始大小-XX:NewSize=256m
-XX:MaxNewSize新生代最大大小-XX:MaxNewSize=512m
-XX:NewRatio新生代與老年代比例(默認1:2)-XX:NewRatio=3(新生代占1/4)
-XX:SurvivorRatioEden與Survivor區比例(默認8:1:1)-XX:SurvivorRatio=4(Eden占80%)

2. 垃圾回收器相關參數

參數說明示例
-XX:+UseSerialGC使用串行垃圾收集器(單線程)-XX:+UseSerialGC
-XX:+UseParallelGC使用并行垃圾收集器(多線程,吞吐優先)-XX:+UseParallelGC
-XX:+UseConcMarkSweepGC使用CMS收集器(低延遲)-XX:+UseConcMarkSweepGC(JDK8~JDK13)
-XX:+UseG1GC使用G1收集器(大內存、低延遲)-XX:+UseG1GC(JDK9+ 默認)
-XX:MaxGCPauseMillisG1的目標停頓時間(默認200ms)-XX:MaxGCPauseMillis=100
-XX:G1HeapRegionSizeG1的Region大小(1~32MB)-XX:G1HeapRegionSize=4M

3. GC日志與性能監控

在這里插入圖片描述

4. 元空間(Metaspace)調優

在這里插入圖片描述

5. 棧內存調優

在這里插入圖片描述

6. 其他關鍵參數

在這里插入圖片描述

📌 三、調優策略與最佳實踐

1. 堆內存調優

建議

  • 初始堆(-Xms)與最大堆(-Xmx)設為相同值,避免動態擴容開銷。
  • 新生代占堆的1/3或1/4,老年代占2/3或3/4。
  • Eden區占新生代的80%(-XX:SurvivorRatio=8)。

示例

  • -Xms2g -Xmx2g -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8

2. 垃圾收集器選擇

在這里插入圖片描述

v3. GC日志分析

日志示例:

2023-10-23T15:30:00.123+0800: [GC (Allocation Failure) [PSYoungGen: 131072K->15360K(157248K)] 131072K->15360K(503936K), 0.0123456 secs] [Times: user=0.05 sys=0.00, real=0.01 secs]

關鍵指標

  • GC類型:Allocation Failure(分配失敗觸發GC)。
  • 內存變化:PSYoungGen: 131072K->15360K(新生代回收后內存占用)。
  • 總內存變化:131072K->15360K(503936K)(堆總內存變化)。
  • 耗時:0.0123456 secs(GC耗時)。

4. OOM問題定位與解決

在這里插入圖片描述

🧱 四、JVM調優步驟與流程

1. 調優流程

  1. 確定目標:吞吐量、停頓時間、內存占用。
  2. 監控JVM狀態:使用 jstat、VisualVM、JConsole。
  3. 分析GC日志:通過 -XX:+PrintGCDetails 定位問題。
  4. 調整參數:優化堆大小、GC收集器、元空間等。
  5. 驗證效果:壓測、監控、觀察GC頻率和停頓時間。

2. 常用調優工具

在這里插入圖片描述

3. 調優常用命令

# 查看JVM參數
jinfo -flags <PID># 實時監控GC
jstat -gc <PID> 1000 10# 生成堆轉儲
jmap -dump:format=b,file=heap.bin <PID># 分析堆轉儲
jhat heap.bin

📊 五、常見JVM調優場景與解決方案

1. 頻繁Full GC

原因

  • 老年代空間不足。
  • 大對象頻繁創建。
  • 元空間內存不足。

解決方案

  • 增加堆大小(-Xmx)。
  • 調整新生代與老年代比例(-XX:NewRatio)。
  • 使用G1收集器(-XX:+UseG1GC)。

2. 內存泄漏

定位方法

  • 使用 jmap 生成堆轉儲(heap dump)。
  • 使用 MAT 分析內存泄漏對象。
  • 檢查緩存、監聽器、線程局部變量(ThreadLocal)。

解決方案

  • 釋放無用對象(如緩存未清理)。
  • 避免靜態集合類(如 static List)。
  • 使用弱引用(WeakHashMap)。

3. 棧溢出(StackOverflowError)

原因

  • 遞歸過深。
  • 線程棧大小不足(默認1MB)。

解決方案

  • 優化遞歸邏輯(改為迭代)。
  • 增加線程棧大小(-Xss2m)。
  • 避免線程數過多(優化線程池配置)。

4. 元空間溢出(Metaspace OOM)

原因

  • 類加載過多(如動態代理、JSP編譯)。
  • 元空間配置過小。

解決方案

  • 增加元空間大小(-XX:MaxMetaspaceSize=256m)。
  • 優化類加載邏輯(避免重復加載)。
  • 使用 -XX:+PrintGCDetails 分析元空間占用。

🧪 六、常見JVM調優面試題及答案

1. -Xms 和 -Xmx 的作用?

答案

  • -Xms:JVM堆的初始大小。
  • -Xmx:JVM堆的最大大小。
  • 建議:將 -Xms 和 -Xmx 設置為相同值,避免動態擴容開銷。

2. -XX:NewRatio=2 和 -XX:SurvivorRatio=8 的含義?

答案

  • -XX:NewRatio=2:新生代與老年代比例為1:2。
  • -XX:SurvivorRatio=8:Eden區與每個Survivor區比例為8:1:1。

3. 如何選擇合適的GC收集器?

答案

  • 吞吐優先:Parallel Scavenge(-XX:+UseParallelGC)。
  • 低延遲:G1(-XX:+UseG1GC)。
  • 兼容性:CMS(JDK8~JDK13)。

4. -XX:+PrintGCDetails 和 -Xloggc 的作用?

答案

  • -XX:+PrintGCDetails:打印詳細GC信息(如GC類型、內存變化)。
  • -Xloggc:/path/to/gc.log:將GC日志輸出到指定文件。

5. 如何避免頻繁Full GC?

答案

  • 增加堆大小(-Xmx)。
  • 避免大對象頻繁創建。
  • 使用 -XX:+DisableExplicitGC 禁用 System.gc()。
  • 使用G1收集器(-XX:+UseG1GC)。

6. 如何分析GC日志?

答案

  • 使用 -XX:+PrintGCDetails 打印詳細GC信息。
  • 使用 GCViewer、GCEasy 等工具分析日志。
  • 關注GC頻率、停頓時間、內存變化趨勢。

7. 如何定位內存泄漏?

答案

  • 使用 jmap -dump 生成堆轉儲。
  • 使用 MAT 分析堆轉儲,定位未釋放對象。
  • 檢查緩存、監聽器、線程局部變量。

? 七、JVM調優核心知識點總結

模塊	核心內容堆內存調優	-Xms、-Xmx、-XX:NewRatio、-XX:SurvivorRatioGC收集器	-XX:+UseG1GC、-XX:+UseParallelGC、-XX:+UseConcMarkSweepGCGC日志分析	-XX:+PrintGCDetails、-Xloggc、-XX:+PrintGCDateStamps元空間調優	-XX:MetaspaceSize、-XX:MaxMetaspaceSize棧調優	-Xss(線程棧大小)調優工具	jstat、jmap、jhat、VisualVM、MAT常見異常	OutOfMemoryError、StackOverflowError、GC overhead limit exceeded

📋 八、完整JVM調優參數示例(生產環境推薦)**

# 堆內存設置
-Xms2g -Xmx2g -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8# G1收集器(JDK9+)
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=4M# 元空間設置
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m# GC日志輸出# 堆內存設置
-Xms2g -Xmx2g -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=8# G1收集器(JDK9+)
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=4M# 元空間設置
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m# GC日志輸出
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/myapp/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M# 性能優化
-XX:+UseTLAB -XX:+DisableExplicitGC -XX:+UseThreadPriorities# OOM處理
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/myapp/heapdump.hprof

📄 九、完整GC日志示例(G1收集器)**

2023-10-23T15:30:00.123+0800: [GC pause (G1

Evacuation Pause) (young), 0.0123456 secs][Parallel Time: 12.34 ms, GC Workers: 8][Eden: 1024.0M(1024.0M) Survivors: 128.0M->128.0M Heap: 1536.0M(2048.0M)][Times: user=0.05 sys=0.00, real=0.01 secs]

日志解析:

  • GC類型:G1 Evacuation Pause(G1的新生代GC)。
  • 耗時:0.0123456 secs(GC總耗時)。
  • 內存變化:Eden: 1024.0M→Survivors: 128.0M→Heap: 1536.0M(2048.0M)(堆內存使用情況)。

📌 十、調優實踐建議

調優方向	建議堆大小	-Xms 和 -Xmx 設置相同,避免動態擴容開銷。新生代比例	-XX:NewRatio=3(新生代占1/4)或 -XX:NewRatio=2(新生代占1/3)。GC日志	開啟 -XX:+PrintGCDetails 和 -Xloggc,分析GC行為。G1調優	設置 -XX:MaxGCPauseMillis=200,調整 -XX:G1HeapRegionSize。元空間	設置 -XX:MaxMetaspaceSize=256m,避免元空間OOM。類加載沖突	使用 -XX:+TraceClassLoading 和 -XX:+TraceClassUnloading 跟蹤類加載。

📚 十一、推薦學習資料

  • 《深入理解 Java 虛擬機》(周志明)
  • 《Java 性能調優指南》
  • JVM 官方文檔:https://docs.oracle.com/en/java/javase/17/gctuning/
  • GC日志分析工具:GCViewer、GCEasy、GCPlot
  • JVM調優視頻教程(B站、慕課網、CSDN)

📄 十二、完整代碼示例(內存溢出場景)**

1. 堆內存溢出(Java Heap OOM)
public class HeapOOM {public static void main(String[] args) {List<byte[]> list = new ArrayList<>();while (true) {list.add(new byte[1024 * 1024]); // 每次分配1MB}}
}
2. 元空間溢出(Metaspace OOM)
public class MetaspaceOOM {public static void main(String[] args) {while (true) {// 使用 CGLIB 動態生成類Enhancer enhancer = new Enhancer();enhancer.setSuperclass(MetaspaceOOM.class);enhancer.setCallback((MethodInterceptor) (obj, method, args1, proxy) -> proxy.invokeSuper(obj, args1));enhancer.create(); // 持續創建新類,導致元空間溢出}}
}

📌 十三、JVM調優實戰建議

在這里插入圖片描述

? 十四、總結:JVM調優核心知識點

在這里插入圖片描述

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

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

相關文章

HOT100--Day13--104. 二叉樹的最大深度,226. 翻轉二叉樹,101. 對稱二叉樹

HOT100–Day13–104. 二叉樹的最大深度&#xff0c;226. 翻轉二叉樹&#xff0c;101. 對稱二叉樹 每日刷題系列。今天的題目是《力扣HOT100》題單。 題目類型&#xff1a;二叉樹。 關鍵&#xff1a;要深刻理解《遞歸》 104. 二叉樹的最大深度 方法&#xff1a;遞歸 思路&…

Maven 從 0 到 1:安裝、配置與依賴管理一站式指南

Maven 從 0 到 1&#xff1a;安裝、配置與依賴管理一站式指南Maven 從 0 到 1&#xff1a;安裝、配置與依賴管理一站式指南一、Maven 是什么&#xff1f;二、核心概念&#xff1a;POM三、Maven 是如何工作的&#xff1f;—— 倉庫機制四、安裝Maven五、在 IntelliJ IDEA 里配置…

k8s,v1.30.4,安裝使用docker

一.前置概念Docker 與 Kubernetes 共用同一個 containerd 進程 時&#xff0c;只要滿足以下 3 個條件&#xff0c;就不會沖突&#xff1a;檢查點要求原因cgroup-driverkubelet 與 containerd 必須同為 systemd二者不一致會導致 Pod 無法調度Unix socketkubelet 指向 /run/conta…

開源AI智能名片鏈動2+1模式S2B2C商城小程序服務提升復購率和轉介紹率的研究

摘要&#xff1a;本文聚焦于開源AI智能名片鏈動21模式S2B2C商城小程序在提升客戶復購率和轉介紹率方面的作用。服務對于促進客戶復購和轉介紹的重要性不言而喻&#xff0c;維護老客戶的成本遠低于開發新客戶&#xff0c;微商通過推出各項服務來贏得客戶忠誠。本文深入探討開源A…

[數據結構] ArrayList(順序表)與LinkedList(鏈表)

目錄 1.List 1.1 什么是List 1.2 常用的方法 1.3 List的使用 2. 線性表 3. ArrayList 類(順序表) 3.1 順序表定義 3.2 ArrayList鏈表的功能模擬實現 3.3 ArrayList簡介 3.4 ArrayList的構造方法 3.5 ArrayList的遍歷 3.5 ArrayList的具體使用實例 3.5.1 楊輝三角 …

Hive使用Tez引擎出現OOM的解決方法

環境是Hive以Tez作為引擎&#xff0c;然后使用客戶端&#xff08;比如DataGrip&#xff09;連接Hive運行SQL查詢&#xff0c;運行過程中報錯信息如下&#xff1a;java.lang.OutOfMemoryError: Java heap space…連接工具以DataGrip為例&#xff0c;解決辦法如下&#xff1a; --…

SQL面試題及詳細答案150道(81-100) --- 子查詢篇

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 81. 什么是子查詢?子查…

筆記:ubuntu安裝matlab

記錄一下ubuntu安裝matlab的過程 一、進入桌面 雖然系統是ubuntu server&#xff0c;但是安裝matlab最好還是有桌面。這里使用todesk等工具&#xff0c;進入桌面進行遠程安裝。 二、創建matlab賬號 由于學校已經提供了matlab的賬號&#xff0c;只需要用自己的學生郵箱進行注冊即…

CentOS 7 編譯安裝 OpenSSL 3.4.2

CentOS 7默認已經安裝了OpenSSL&#xff0c;不過版本比較低 openssl version結果為&#xff1a;OpenSSL 1.0.2k-fips 26 Jan 2017 已經無法滿足需求 OpenSSL 源碼下載鏈接&#xff1a;https://www.openssl-library.org/source/ 下載源碼包為&#xff1a;https://github.com…

python advance -----object-oriented

alt shift 上下鍵&#xff0c;行代碼上下移動0

具身智能的工程落地:視頻-控制閉環的實踐路徑

引言&#xff1a;從“能算會說”到“會看能做” 具身智能真正的門檻&#xff0c;不在于把模型做得更大&#xff0c;而在于把感知—決策—執行焊成一條低時延、穩態可控的閉環工程鏈路&#xff1a;從相機/麥克風采集&#xff0c;到編解碼與傳輸&#xff0c;再到邊/端推理、指令…

STM32 - Embedded IDE - GCC - 如何在工程中定義一段 NoInit RAM 內存

導言如上所示&#xff0c;Keil創建一段NoInit內存同樣是通過圖形界面來完成&#xff0c;IRAM2的起始地址0x2000000&#xff0c;大小8bytes。NoInit的意思是程序初始化時&#xff0c;不會將內存清0初始化。如上所示&#xff0c;在MEMORY段&#xff0c;將64K的RAM內存劃一塊8byte…

MyBatisX代碼生成插件在IDEA中的安裝配置、連接數據庫表生成代碼快速開發示例

場景 MyBatisX插件介紹 MybatisX是一款基于IDEA的快速開發插件&#xff0c;由MyBatis-Plus團隊開發維護&#xff0c;為效率而生。 它的主要功能如下&#xff1a; 支持mapper.xml和Mapper接口之間方法的互相導航跳轉&#xff1b; 內置代碼生成器&#xff0c;通過使用GUI的形…

單詞分析與助記之數據建表(以production為例)

單詞分析與助記數據建表&#xff08;以production為例&#xff09;&#xff1a; id&#xff08;流水號&#xff09;&#xff1a;詞形&#xff1a;production配圖1-標題&#xff1a;略配圖1-地址&#xff1a;略配圖2-標題&#xff1a;略配圖2-地址&#xff1a;略配圖3-標題&…

AI助力決策:告別生活與工作中的糾結,明析抉擇引領明智選擇

在日常生活與工作中&#xff0c;我們時常會面臨各種糾結的決策。從選擇一份新工作、創業方向&#xff0c;到決定是否要搬家、換車&#xff0c;每一個決策都可能對我們的未來產生深遠影響。然而&#xff0c;面對復雜多變的信息和不確定的未來&#xff0c;如何做出明智的選擇成為…

--定位--

GPSRTK GPS組成 GPS分為三部分。 空間星座部分&#xff1a;由至少24顆衛星組成&#xff08;目前有30多顆在軌運行&#xff09;&#xff0c;分布在6個中地球軌道上。保證全球任何地方、任何時間至少能接收到4顆以上的衛星信號。每顆衛星不斷播發一種包含衛星星歷?&#xff0…

音轉文模型對比FunASR與Faster_whisper

FunASR簡介 FunASR是由阿里巴巴達摩院開源的語音識別工具包&#xff0c;提供包括語音識別&#xff08;ASR&#xff09;、語音活動檢測&#xff08;VAD&#xff09;、標點恢復、語言模型、說話人驗證、說話人分離及多說話人ASR等多種功能。FunASR工具包支持工業級語音識別模型的…

uniapp阿里云驗證碼使用

在 UniApp 中使用阿里云驗證碼插件&#xff08;aliyun-captcha&#xff09;需要完成微信小程序端的插件配置和項目內的組件使用兩個主要步驟&#xff0c;以下是詳細流程&#xff1a; 一、微信公眾平臺配置插件&#xff08;必須&#xff09; 獲取插件 AppID 阿里云驗證碼插件的…

基于開源AI大模型AI智能名片S2B2C商城小程序的情感營銷策略研究

摘要&#xff1a;本文聚焦于開源AI大模型AI智能名片S2B2C商城小程序這一新興商業工具&#xff0c;探討情感在其營銷中的核心地位。情感在營銷里是需突出表現的關鍵要素&#xff0c;價值觀與極致化生活方式均是對情感的闡釋。在開源AI大模型AI智能名片S2B2C商城小程序的背景下&a…

警惕!你和ChatGPT的對話,可能正在制造分布式妄想

2021年圣誕節&#xff0c;19歲的英籍印度裔男子 賈斯旺辛格柴爾 &#xff08;Jaswant Singh Chail&#xff09;帶著一把十字弩闖入溫莎城堡&#xff0c;聲稱要 刺殺英國女王 &#xff0c;為英國歷史上的暴行復仇。 這場荒謬的刺殺注定以失敗告終。被捕后&#xff0c;他自稱是一…