
最重要的JVM参数总结
堆内存配置
Java虚拟机所管理的内存中最大的一块,Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
与性能有关的最常见实践之一是根据应用程序要求初始化堆内存。推荐显示指定最小和最大堆大小:
参数说明
-
-Xms<heap size>[unit]
初始堆内存大小,单位:g/m/k
示例:-Xms2G
-
-Xmx<heap size>[unit]
最大堆内存大小,单位:g/m/k
示例:-Xmx5G
组合示例:-Xms2G -Xmx5G
新生代内存配置
配置方法
-
独立指定
-XX:NewSize=<young size>[unit]
新生代初始大小-XX:MaxNewSize=<young size>[unit]
新生代最大大小
示例:-XX:NewSize=256m -XX:MaxNewSize=1024m
-
统一指定
-Xmn<young size>[unit]
设置固定新生代大小
示例:-Xmn256m
调优策略
- 通过
-XX:NewRatio=<int>
设置老年代与新生代内存比值
示例:-XX:NewRatio=1
(老年代:新生代=1:1)
元空间配置
JDK 1.8+参数
-
-XX:MetaspaceSize=N
触发Full GC的初始阈值(默认约20.8MB) -
-XX:MaxMetaspaceSize=N
元空间最大容量
注意事项
- 实际初始容量由JVM根据平台决定(12-20MB)
- 达到
MetaspaceSize
值后会触发FGC并动态扩容 - 未设置
MaxMetaspaceSize
时可能耗尽系统内存
垃圾收集器配置
收集器类型
-
-XX:+UseSerialGC
串行垃圾收集器 -
-XX:+UseParallelGC
并行垃圾收集器 -
-XX:+UseConcMarkSweepGC
CMS收集器 -
-XX:+UseG1GC
G1收集器
GC日志配置
基础配置
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintTenuringDistribution
-XX:+PrintHeapAtGC
-XX:+PrintReferenceGC
-XX:+PrintGCApplicationStoppedTime
高级配置
-Xloggc:/path/to/gc-%t.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=14
-XX:GCLogFileSize=50M
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
内存溢出处理
关键参数
-
-XX:+HeapDumpOnOutOfMemoryError
发生OOM时生成堆转储 -
-XX:HeapDumpPath=./java_pid<pid>.hprof
堆转储文件路径 -
-XX:OnOutOfMemoryError="<command>"
OOM时执行命令(如shutdown -r
) -
-XX:+UseGCOverheadLimit
启用GC时间占比限制策略
其他重要参数
性能优化
-
-server
启用服务端模式(64位JVM默认) -
-XX:+UseStringDeduplication
字符串去重优化(Java 8u20+)
内存管理
-
-XX:LargePageSizeInBytes=N
大页内存大小 -
-XX:SurvivorRatio=N
Eden与Survivor区比例(默认8)
调试参数
-
-XX:+UseCompressedStrings
启用字符串压缩存储 -
-XX:+OptimizeStringConcat
优化字符串拼接操作