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%) |
关键参数说明
-
CMS相关
-
-XX:+CMSParallelRemarkEnabled:启用并行标记(减少停顿)。 -
-XX:+CMSClassUnloadingEnabled:允许CMS回收元空间(JDK8需显式开启)。
-
-
G1相关
-
-XX:G1NewSizePercent/-XX:G1MaxNewSizePercent:年轻代占比(默认5%-60%)。 -
-XX:G1MixedGCLiveThresholdPercent=85:Mixed GC时存活对象占比阈值。
-
-
通用参数
-
-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

浙公网安备 33010602011771号