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:SurvivorRatio=8,这是该参数的默认值,所以Eden:S0:S1=8:1:1。
-XX:SurvivorRatio=4,Eden:S0:S1=4:1:1,千万不要以为新生代是被分成10份,Eden:S0:S1会是4:3:3,这是错误的。
-XX:SurvivorRatio=5,Eden:S0:S1=5:1: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
这个参数设置大一些即可,千万别让一些新手同学设置为0,可以设置个1000,2000,3000,或者5000毫秒,都可以。
提高这个数值,就是让反射过程中JVM自动创建的软引用的一些类的Class对象不要被随便回收,当时我们优化这个参数之后,就可以看到系统稳定运行了。

禁止显式执行GC

-XX:+DisableExplicitGC

这个参数的意思就是禁止显式执行GC,不允许你来通过代码触发GC。

System.gc() 无效

OOM自动报错内存快照

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/usr/local/app/oom

第一个参数意思是在OOM的时候自动dump内存快照出来,第二个参数是说把内存快照放到哪儿去

开启多线程收集

-XX:+CMSParallelInitialMarkEnabled

参数可以开启多线程并发进行标记,减少暂停时间。

 

-XX:+CMSScavengeBeforeRemark

开启在CMS重新标记阶段之前的清除尝试

 

posted @ 2021-08-18 16:36  白日梦丶  阅读(239)  评论(0)    收藏  举报