JVM参数优化和溢出场景
Java堆溢出
-Xms 最小值
-Xmx 最大值
通过参数 -XX:+HeapDumpOnOutOfMemoryError 可以让虚拟机再出现内存溢出异常的时候Dump当前的内存堆转储快照。
虚拟机栈和本地方法栈溢出
-Xoss 参数设置本地方法栈大小,实践没有任何效果
-Xss 参数来设置栈容量大小
方法区和运行时常量溢出
运行时常量池是方法区的一部分,
⚠️注意:自JDK7起,原本存放在永久代的字符串常量池被移至Java堆之中。
-XX:MaxMetaspaceSize 设置元空间最大值,默认为-1,即不限制,或者说只受限于本地内存大小。
-XX:MetaspaceSize
-XX:MinMetaspaceFreeRatio
本机直接内存溢出
直接内存可以通过
-XX:MaxDirectMemorySize 参数来指定,如果不去指定,则默认于Java堆最大值一致。
jdk8,jvm参数模板
-Xms4096M -Xmx4096M -Xmn3072M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFaction=92 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSParallelInitialMarkEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/app/oom
jdk11,我本地开发启动时参数
-Xms1024M -Xmx1024M -Xmn600M -Xss2M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行老年代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
-XX:+UseG1GC G1垃圾回收器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。
GC日志
-XX:+PrintGCDetails 打印GC日志细节
-XX:+PrintGCTimeStamps 打印GC日志时间
-Xloggc:gc.log 将GC日志输出到指定的磁盘文件上去,这里会把gc.log输出到项目根路径
|
堆初始大小 |
-Xms3072M |
堆内存的初始大小,默认是物理内存的1/64 -XX:InitialHeapSize=3072M |
||
|
堆最大大小 |
-Xmx3072M |
堆内存的最大大小,默认是物理内存的 1/4 -XX:MaxHeapSize=3072M |
||
|
堆内存新生代大小 |
-Xmn2048M |
堆内存新生代的大小,老年代的大小可以通过堆内存-新生代内存大小得出。默认 新生代和老年的比例 是 1:2 新生代大小也可以单独设置 初始大小和最大大小: -XX:newSize -XX:MaxnewSize |
||
|
栈大小 |
-Xss1M |
设置每个线程可使用的内存大小,即栈的大小, 默认值是 -Xss1024KB |
||
|
永久代大小 |
-XX:PermSize -XX:MaxPermSize |
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前) |
||
|
元控件大小 |
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M |
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后) |
||
|
堆内存新生代eden区占比 |
-XX:SurvivorRatio=8 |
eden区占比大小。eden 8 ,s1:1,s2:1。 冷知识: |
||
|
进入老年代的年龄阈值 |
-XX:MaxTenuringThreshold=5 |
新生代对象躲过多少次垃圾回收后进入老年代.默认是 15次。 看有的博客说最大值就是15,因为也就4bit存储这个信息。 |
||
|
直接进入老年代的对象大小阈值 |
-XX:PretenureSizeThreshold=1M |
多大的对象直接进入老年代.这里设置的是 1M。PretenureSizeThreshold 老年代空间使用的阈值 |
老年代空间使用的阈值 -XX:CMSInitiatingOccupancyFraction=92 |
老年代空间使用达到百分之九十二 就进行full GC |
|
压缩整理 |
-XX:CMSFullGCsBeforeCompaction=5 |
就是在5次Full GC之后会触发一次Compaction操作,也就是压缩操作 |
||
|
软引用回收时间 |
SoftRefLRUPolicyMSPerMB |
SoftRefLRUPolicyMSPerMB 默认是 1000毫秒 clock - timestamp <= freespace * SoftRefLRUPolicyMSPerMB -XX:SoftRefLRUPolicyMSPerMB=0 |
||
|
禁止显式执行GC |
-XX:+DisableExplicitGC |
这个参数的意思就是禁止显式执行GC,不允许你来通过代码触发GC。 System.gc() 无效 |
||
|
OOM自动报错内存快照 |
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/app/oom |
第一个参数意思是在OOM的时候自动dump内存快照出来,第二个参数是说把内存快照放到哪儿去 |
||
|
开启多线程收集 |
-XX:+CMSParallelInitialMarkEnabled |
参数可以开启多线程并发进行标记,减少暂停时间。 |
||
|
-XX:+CMSScavengeBeforeRemark |
开启在CMS重新标记阶段之前的清除尝试 |

浙公网安备 33010602011771号