JVM -堆-JVM 参数 -01

1、启动 java项目时,可以 打印所有参数 ,用-XX:+PrintFlagsFinal 

[root ]#  java -XX:+PrintFlagsFinal  -jar test.jar

 

2、运行java 项目时,可以指定使用哪个垃圾收集器,修改JVM参数

[root]# java  -jar -XX:+UseG1GC  -jar xxx.jar

 

3、了解JVM的常用参数有如下这些

3.1  堆的 jvm 参数 

 JVM 堆内存相关参数

参数分类参数默认值说明使用示例
初始堆大小 -Xms100M 或 -XX:InitialHeapSize=100M 根据系统内存 建议与 -Xmx 设相同,避免动态扩容带来的性能波动。 java -Xms512M -Xmx512M -jar app.jar
(固定堆大小,避免扩容开销)
最大堆大小 -Xmx100M 或 -XX:MaxHeapSize=100M 系统内存的1/4 生产环境建议不超过物理内存的80%。 java -Xms2G -Xmx4G -jar app.jar
(允许堆动态扩展,最大4GB)
年轻代大小 -XX:NewSize=20M 根据 -Xmx 比例 年轻代初始大小。 java -XX:NewSize=200M -Xmx1G -jar app.jar
(显式设置年轻代初始大小)
年轻代最大大小 -XX:MaxNewSize=50M 无严格默认值 限制年轻代动态扩容上限。 java -XX:MaxNewSize=500M -Xmx2G -jar app.jar
(限制年轻代不超过500MB)
老年代大小 -XX:OldSize=50M 剩余堆内存 老年代初始大小(需满足 OldSize + NewSize ≤ Xms)。 java -XX:OldSize=800M -Xms1G -jar app.jar
(直接分配800MB给老年代)
新老代比例 -XX:NewRatio=2 2(老年代:年轻代) 值为 N 表示老年代是年轻代的 N 倍(如 2 表示 老年代占2/3堆)。 java -XX:NewRatio=3 -Xmx1G -jar app.jar
(老年代占堆的3/4,年轻代占1/4)
Eden/Survivor比例 -XX:SurvivorRatio=8 8(Eden:S0) 值为 N 表示 Eden 区是一个Survivor区的 N 倍(如 8 表示 Eden占8/10)。 java -XX:SurvivorRatio=6 -jar app.jar
(Eden:S0:S1 = 6:1:1)

 

GC 日志与内存溢出诊断

参数分类参数默认值说明使用示例
内存溢出自动Dump -XX:+HeapDumpOnOutOfMemoryError 关闭 OOM时自动生成堆转储文件,便于后续分析。 java -XX:+HeapDumpOnOutOfMemoryError -jar app.jar
(OOM时生成默认路径的堆转储文件)
指定Dump路径 -XX:HeapDumpPath=./heap.hprof 或 -XX:HeapDumpPath=./java_pid%p.hprof %p 会自动替换为进程ID。 java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/oom.hprof -jar app.jar
(指定转储到/tmp目录)
打印详细GC日志 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log 关闭 记录GC时间、耗时等。 java -Xloggc:./logs/gc.log -XX:+PrintGCDetails -jar app.jar
(输出GC日志到文件并打印详情)
现代GC日志格式(JDK9+) -Xlog:gc*:file=gc.log:time:filecount=5,filesize=10M 更高效的日志记录,支持滚动日志。 java -Xlog:gc*:file=gc.log -jar app.jar
(JDK9+推荐格式,记录所有GC事件)

 

垃圾回收调优参数

参数分类参数默认值说明使用示例
晋升老年代年龄阈值 -XX:MaxTenuringThreshold=16 15 对象经过Minor GC的存活次数超过该值会晋升到老年代(范围1-15)。 java -XX:MaxTenuringThreshold=10 -jar app.jar
(降低晋升阈值,让对象更快进入老年代)
GC算法选择(吞吐优先) -XX:+UseParallelGC 取决于JVM 吞吐量优先(Parallel Scavenge)。 java -XX:+UseParallelGC -XX:ParallelGCThreads=4 -jar app.jar
(并行GC,4个GC线程)
GC算法选择(低延迟) -XX:+UseG1GC   低延迟优先(G1 GC)。 java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar app.jar
(G1 GC,目标停顿200ms)
GC算法选择(超低延迟) -XX:+UseZGC   超低延迟(JDK11+,适合大堆)。 java -XX:+UseZGC -Xmx16G -jar app.jar
(ZGC适合大内存应用,如大数据服务)

 

其他重要参数补充

参数分类参数说明使用示例
元空间大小 -XX:MetaspaceSize=128M 元空间初始大小(取代PermGen)。 java -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=512M -jar app.jar
(限制元空间增长)
直接内存限制 -XX:MaxDirectMemorySize=1G 限制NIO堆外内存使用。 java -XX:MaxDirectMemorySize=2G -jar app.jar
(防止堆外内存过度占用)
禁用显式GC -XX:+DisableExplicitGC 禁止代码中调用 System.gc()(避免误触发Full GC)。 java -XX:+DisableExplicitGC -jar app.jar
(适用于Netty等依赖堆外内存的框架)
压缩普通对象指针 -XX:+UseCompressedOops 启用指针压缩(64位系统默认开启),减少内存占用。 java -XX:+UseCompressedOops -Xmx6G -jar app.jar
(堆内存<32G时建议开启)

 

 

完整调优示例

场景1:高吞吐量服务(ParallelGC)

java -Xms4G -Xmx4G -XX:NewRatio=3 -XX:SurvivorRatio=8 \
-XX:+UseParallelGC -XX:ParallelGCThreads=4 \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/oom.hprof \
-Xloggc:/logs/gc.log -XX:+PrintGCDetails \
-jar order-service.jar

 

场景2:低延迟服务(G1GC)

java -Xms8G -Xmx8G -XX:+UseG1GC -XX:MaxGCPauseMillis=100 \
-XX:InitiatingHeapOccupancyPercent=45 \
-XX:+HeapDumpOnOutOfMemoryError \
-Xlog:gc*:file=/logs/gc.log:time,uptime,level,tags \
-jar payment-service.jar

 

 

4、收集器相关

JVM垃圾收集器分类与参数

收集器类型启用参数适用场景核心调优参数使用示例
串行收集器 -XX:+UseSerialGC(年轻代+老年代) 单线程、低配资源 无特殊参数(适合客户端或微服务测试) java -XX:+UseSerialGC -Xms128M -Xmx128M -jar app.jar
  -XX:+UseSerialOldGC(仅老年代)      
并行收集器(吞吐量优先) -XX:+UseParallelGC(年轻代) 多核CPU、高吞吐 -XX:ParallelGCThreads=N(GC线程数,默认CPU核数) java -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4 -jar app.jar
  -XX:+UseParallelOldGC(老年代)   -XX:GCTimeRatio=N(吞吐量目标,默认99=1% GC时间) java -XX:GCTimeRatio=19 -jar app.jar(目标GC时间占比≤5%)
CMS收集器(低延迟) -XX:+UseConcMarkSweepGC(老年代) 老年代低停顿 -XX:ConcGCThreads=N(并发GC线程数) java -XX:+UseConcMarkSweepGC -XX:ConcGCThreads=2 -jar app.jar
  -XX:+UseParNewGC(年轻代,默认启用)   -XX:CMSInitiatingOccupancyFraction=70(老年代占用阈值触发CMS,默认68%) java -XX:CMSInitiatingOccupancyFraction=75 -jar app.jar
G1收集器(平衡型) -XX:+UseG1GC 大堆、低停顿 -XX:MaxGCPauseMillis=200(目标最大停顿时间,默认200ms) java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -jar app.jar
      -XX:G1HeapRegionSize=N(Region大小,2MB-32MB) java -XX:G1HeapRegionSize=16M -Xmx8G -jar app.jar(Region数=8G/16M=512个)
      -XX:InitiatingHeapOccupancyPercent=45(触发并发标记的堆占用比,默认45%) java -XX:InitiatingHeapOccupancyPercent=40 -jar app.jar(更早触发GC)
      -XX:G1HeapWastePercent=5(可回收内存占比阈值触发Mixed GC,默认5%)

关键参数说明

  1. CMS相关

    • -XX:+CMSParallelRemarkEnabled:启用并行标记(减少停顿)。

    • -XX:+CMSClassUnloadingEnabled:允许CMS回收元空间(JDK8需显式开启)。

  2. G1相关

    • -XX:G1NewSizePercent / -XX:G1MaxNewSizePercent:年轻代占比(默认5%-60%)。

    • -XX:G1MixedGCLiveThresholdPercent=85:Mixed GC时存活对象占比阈值。

  3. 通用参数

    • -XX:SurvivorRatio=8(所有收集器适用):Eden与Survivor区比例。


收集器选择建议

场景推荐收集器参数示例
单核/低内存 串行收集器 -XX:+UseSerialGC
多核/高吞吐量 Parallel Scavenge -XX:+UseParallelGC -XX:GCTimeRatio=99
老年代低停顿(JDK8) CMS -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75
大堆/平衡停顿(JDK11+) G1 -XX:+UseG1GC -XX:MaxGCPauseMillis=150

如何验证当前收集器?

# 查看当前GC算法
jinfo -flag UseParallelGC <pid>      # 检查是否使用ParallelGC
jinfo -flag UseG1GC <pid>           # 检查是否使用G1GC

# 查看所有GC相关参数
java -XX:+PrintFlagsFinal -version | grep GC

 

posted @ 2025-05-28 18:46  Shafir莎菲尔  阅读(57)  评论(0)    收藏  举报