在Tomcat? ? ?conf/catalina.bat或catalina.sh中 的最上面增加參數
1. 初步調整參數(緩解問題)
set JAVA_OPTS=
-Xms6g -Xmx6g
-Xmn3g # 增大新生代,減少對象過早晉升到老年代
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=1g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+ParallelRefProcEnabled # 加速引用處理
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./heapdump.hprof --JDK9使用參數
-Xlog:gc*,gc+heap=debug:file=./logs/gc.log:time,uptimemillis:filecount=10,filesize=10M--JDK8及以下使用參數
-Xloggc:./logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 ?-XX:GCLogFileSize=10M
--JDK9使用參數
set JAVA_OPTS= -Xms6g -Xmx6g -Xmn3g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof -Xlog:gc*,gc+heap=debug:file=./logs/gc.log:time,uptimemillis:filecount=10,filesize=10M
--JDK8及以下使用參數
set JAVA_OPTS= -Xms6g -Xmx6g -Xmn3g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof -Xloggc:./logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M
2. 堆外內存限制(若 Netty 使用 Direct Buffer)
-XX:MaxDirectMemorySize=2g # 限制堆外內存,默認與 -Xmx 相同
以下是每個參數的詳細解釋及其作用:
1.?-Xms6g
?和?-Xmx6g
-
含義:
-
-Xms6g
:設置 JVM?堆內存的初始大小為 6GB。 -
-Xmx6g
:設置 JVM?堆內存的最大大小為 6GB。
-
-
作用:
-
將堆的初始值和最大值設為相同,避免堆動態擴展時的性能開銷。
-
6GB 的堆大小適用于需要處理高并發或大數據的應用場景。
-
-
注意事項:
-
若堆內存不足(OOM 錯誤),需結合應用需求適當增大?
-Xmx
,但需考慮物理內存限制。
-
2.?-Xmn3g
-
含義:
-
設置?新生代(Young Generation)的大小為 3GB。
-
-
作用:
-
新生代是對象初次分配的區域,較大的新生代可減少對象過早晉升到老年代(Old Generation)的頻率。
-
默認新生代與老年代比例為?
1:2
(如?-Xmn3g
?時,老年代為?6g - 3g = 3g
)。
-
-
調優場景:
-
適合短生命周期對象較多的應用(如 Web 請求的臨時對象),減少 Full GC 頻率。
-
3.?-XX:MetaspaceSize=256m
?和?-XX:MaxMetaspaceSize=1g
-
含義:
-
MetaspaceSize
:設置?元空間(Metaspace)的初始大小為 256MB。 -
MaxMetaspaceSize
:設置?元空間的最大大小為 1GB。
-
-
作用:
-
元空間用于存儲類的元數據(如類信息、方法字節碼),取代 Java 8 之前的永久代(PermGen)。
-
設置初始大小避免頻繁的元空間動態擴展;設置上限防止元空間無限膨脹(如類加載器泄漏)。
-
-
注意事項:
-
若應用頻繁加載/卸載類(如動態代理),需適當增大?
MaxMetaspaceSize
。
-
4.?-XX:+UseG1GC
-
含義:
-
啟用?G1(Garbage-First)垃圾回收器。
-
-
作用:
-
G1 是面向大堆(>4GB)的垃圾回收器,通過分代和分區(Region)策略,平衡吞吐量和低延遲。
-
特點:
-
并發標記:與用戶線程并行執行部分 GC 操作。
-
可預測停頓:通過?
MaxGCPauseMillis
?控制目標停頓時間。 -
混合回收:在回收新生代時,同時回收部分老年代。
-
-
5.?-XX:MaxGCPauseMillis=200
-
含義:
-
設置 G1 垃圾回收器的?目標最大停頓時間為 200 毫秒。
-
-
作用:
-
G1 會盡量調整 GC 策略(如每次回收的 Region 數量)以滿足該目標。
-
較小的值(如 50ms)會減少單次 GC 停頓時間,但可能增加 GC 頻率。
-
-
注意事項:
-
這是一個“軟目標”,JVM 會盡力達成,但不保證絕對不超過。
-
6.?-XX:+ParallelRefProcEnabled
-
含義:
-
啟用?并行處理引用對象(如軟引用、弱引用、虛引用、Finalizer)。
-
-
作用:
-
加速引用對象的處理,減少 Full GC 的停頓時間。
-
默認情況下,引用處理是單線程的,可能成為 Full GC 的瓶頸。
-
7.?-XX:+HeapDumpOnOutOfMemoryError
?和?-XX:HeapDumpPath=./heapdump.hprof
-
含義:
-
HeapDumpOnOutOfMemoryError
:在發生 OOM 時自動生成堆轉儲(Heap Dump)。 -
HeapDumpPath
:指定堆轉儲文件的保存路徑(如?./heapdump.hprof
)。
-
-
作用:
-
堆轉儲是內存快照,用于分析 OOM 時的內存占用情況(如內存泄漏)。
-
默認路徑為當前工作目錄,建議指定固定目錄(如?
./logs
)。
-
8.?-Xlog:gc*,gc+heap=debug:file=./logs/gc.log:time,uptimemillis:filecount=10,filesize=10M
-
含義:
-
配置詳細的?GC 日志輸出。
-
-
參數分解:
-
gc*
:記錄所有 GC 事件。 -
gc+heap=debug
:啟用堆內存變化的調試信息。 -
file=./logs/gc.log
:日志文件路徑。 -
time,uptimemillis
:日志中顯示時間戳和 JVM 啟動后的毫秒數。 -
filecount=10,filesize=10M
:保留最多 10 個日志文件,每個文件最大 10MB。
-
-
作用:
-
通過 GC 日志分析 GC 頻率、停頓時間、內存回收效率。
-
示例日志片段:
復制
下載
[2023-10-01T12:34:56.789+0800][12345ms] GC(0) Pause Young (Normal) 2048M->512M(6144M) 50ms
-
9.?-XX:MaxDirectMemorySize=2g
-
含義:
-
設置 JVM?堆外內存(Direct Memory)的最大大小為 2GB。
-
-
作用:
-
堆外內存由?
ByteBuffer.allocateDirect()
?或 Netty 的?PooledByteBuf
?分配,不經過 GC 管理。 -
默認值為?
-Xmx
(即與堆內存相同),顯式設置可防止堆外內存泄漏導致系統崩潰。
-
-
注意事項:
-
Netty 等 NIO 框架大量使用堆外內存,需結合應用實際需求調整此值。
-
參數分類總結
類別 | 參數示例 | 核心作用 |
---|---|---|
堆內存 | -Xms6g -Xmx6g -Xmn3g | 控制堆大小及分代比例 |
元空間 | -XX:MetaspaceSize=256m | 管理類元數據內存 |
垃圾回收器 | -XX:+UseG1GC | 選擇高效低延遲的 GC 算法 |
GC調優 | -XX:MaxGCPauseMillis=200 | 平衡吞吐量和停頓時間 |
診斷工具 | -XX:+HeapDumpOnOutOfMemoryError | 捕獲 OOM 時的內存快照 |
日志與監控 | -Xlog:gc*... | 記錄 GC 行為供后續分析 |
堆外內存 | -XX:MaxDirectMemorySize=2g | 防止堆外內存泄漏 |
最終建議
-
監控驗證:
-
部署后使用?
jstat
、jcmd
?或 VisualVM 實時監控內存和 GC 行為。 -
檢查 GC 日志中 Full GC 的頻率和耗時。
-
-
堆轉儲分析:
-
若再次發生 OOM,使用 MAT 分析?
heapdump.hprof
,重點關注?Retained Heap
?最大的對象。
-
-
Netty 專項檢查:
-
添加?
-Dio.netty.leakDetection.level=PARANOID
?參數,啟用 Netty 內存泄漏檢測。 -
確保所有?
ByteBuf
?通過?release()
?釋放。
-