JVM 参数配置

JVM 调优参数详解

🎯 面试重点

📖 堆内存参数

# 堆大小
-Xms4g              # 初始堆大小
-Xmx4g              # 最大堆大小
# 建议:Xms = Xmx,避免动态扩容

# 年轻代
-Xmn2g              # 年轻代大小
-XX:NewRatio=2      # 新生代:老年代 = 1:2
-XX:SurvivorRatio=8 # Eden:Survivor = 8:1

# 元空间
-XX:MetaspaceSize=256m      # 初始元空间大小
-XX:MaxMetaspaceSize=512m   # 最大元空间大小

# 直接内存
-XX:MaxDirectMemorySize=1g  # 最大直接内存

📖 GC 参数

Serial GC

-XX:+UseSerialGC
# 单线程 GC,适合客户端

Parallel GC

-XX:+UseParallelGC           # 年轻代使用 Parallel
-XX:+UseParallelOldGC        # 老年代使用 Parallel
-XX:ParallelGCThreads=4      # GC 线程数
-XX:MaxGCPauseMillis=200     # 最大停顿时间目标
-XX:GCTimeRatio=99           # 吞吐量目标

CMS GC

-XX:+UseConcMarkSweepGC      # 使用 CMS
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70  # 老年代 70% 触发
-XX:+CMSScavengeBeforeRemark  # Remark 前做一次 Young GC
-XX:+CMSParallelRemarkEnabled # 并行 Remark

G1 GC

-XX:+UseG1GC                 # 使用 G1
-XX:MaxGCPauseMillis=200     # 最大停顿时间
-XX:G1HeapRegionSize=8m      # Region 大小
-XX:InitiatingHeapOccupancyPercent=45  # 触发阈值
-XX:G1ReservePercent=10      # 保留空间

ZGC

-XX:+UseZGC                  # 使用 ZGC
-XX:ConcGCThreads=4          # 并发 GC 线程
-XX:ZAllocationSpikeTolerance=5  # 分配尖峰容忍度

📖 GC 日志参数

# JDK 8
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationStoppedTime
-Xloggc:/path/to/gc.log

# JDK 9+
-Xlog:gc*:file=/path/to/gc.log:time,tags:filecount=5,filesize=100m

📖 OOM 处理参数

# OOM 时导出堆转储
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dump

# OOM 时执行脚本
-XX:OnOutOfMemoryError="/path/to/script.sh"

📖 其他常用参数

# 线程栈大小
-Xss1m

# 大对象直接进入老年代
-XX:PretenureSizeThreshold=1m

# 晋升年龄阈值
-XX:MaxTenuringThreshold=15

# 禁用偏向锁
-XX:-UseBiasedLocking

# 字符串去重(G1)
-XX:+UseStringDeduplication

# 压缩指针
-XX:+UseCompressedOops
-XX:+UseCompressedClassPointers

📖 生产配置示例

4C8G 服务器

# Web 应用
-Xms4g -Xmx4g
-Xmn1g
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-Xlog:gc*:file=/var/log/gc.log:time,tags
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/heap.hprof

8C16G 服务器

# 服务端应用
-Xms12g -Xmx12g
-Xmn4g
-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:G1HeapRegionSize=16m
-XX:InitiatingHeapOccupancyPercent=40

大数据应用

# 内存敏感型
-Xms32g -Xmx32g
-XX:+UseZGC
-XX:ConcGCThreads=8
-XX:ZCollectionInterval=5

📖 面试真题

Q1: 常用的 JVM 参数?

答:

Q2: 如何设置堆大小?

答:

Q3: 如何选择垃圾收集器?

答:


⭐ 重点:JVM 参数配置是性能调优的基础