jvm参数
-Xms8g 最小堆
-Xmx8g 最大堆
-Xmn512m 年轻代
此处的大小是(eden+ 2 survivor space),与jmap -heap中显示的New gen是不同的(jmap的new gen 是 eden+1个Survivor区)。
-XX:NewRatio=2 年轻代和老年代的比例
等于2表示,1:2,即年轻代占堆内存的1/3
-XX:SurvivorRatio
设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
整个堆大小=年轻代大小 + 年老代大小 + 持久代大小(1.8无)
-Xss 每个线程的堆栈大小,谨慎配置
-XX:PermSize=5m 方法区 (1.8无,1.8为 -XX:MetaspaceSize=200m;-XX:MaxMetaspaceSize=256m;)
Java HotSpot(TM) Client VM warning: ignoring option PermSize=5m; support was removed in 8.0
-XX:MetaspaceSize=512m 元空间 1.8新增
-XX:MaxMetaspaceSize=512m 最大元空间
-XX:NewRatio 整个年轻代与老年代的比例,4 表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8
-XX:CMSInitiatingOccupancyFraction=70 使用CMS作为垃圾回收,使用70%后开始CMS收集
-XX:MaxTenuringThreshold 垃圾最大年龄,如果设置为0的话,则年轻代对象不经Survivor区,直接进入年老代
-XX:SurvivorRatio=65536,-XX:MaxTenuringThreshold=0 去掉了救助空间
-XX:+UseParNewGC 对年轻代采用多线程并行回收
-XX:+CMSClassUnloadingEnabled 垃圾回收会清理持久代,移除不再使用的classes(前提:-XX:+UseConcMarkSweepGC)
-XX:+UseCMSInitiatingOccupancyOnly 指定HotSpot总是使用CMSInitiatingOccupancyFraction的值作为old的空间使用率限制来启动CMS垃圾回收,如果没有使用-XX:+UseCMSInitiatingOccupancyOnly,那么HotSpot只是利用这个值来启动第一次CMS垃圾回收,后面都是使用HotSpot自动计算出来的值
-Xloggc:E:/gclog/gc.log windows下日志输出
-Xloggc:/gclog/gc.log linux
-XX:+PrintGCDetails 打印GC日志,配合xloggc使用,否则只是在控制台输出
-XX:+PrintGCDateStamps 记录系统时间
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\oomdum
OOM自动生成java_pidXXX.hprof
-XX:+PrintCommandLineFlags 输出垃圾收集器类型
-XX:+PrintGCApplicationStoppedTime 打印停顿时间
-XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 输出safepoint的统计信息
错误: 找不到或无法加载主类 –XX:PrintSafepointStatisticsCount=1
-XX:+DisableExplicitGC 禁止代码中的System.gc()
-XX:+ExplicitGCInvokesConcurrent 使得外部system.gc生效
System.gc()是正常FULL GC,会STW
打开此参数后,在做System.gc()时会做background模式CMS GC,即并行FULL GC,可提高FULL GC效率
-XX:+CMSScavengeBeforeRemark 开启或关闭在CMS重新标记阶段之前的清除(YGC)尝试
CMS并发标记阶段与用户线程并发进行,此阶段会产生已经被标记了的对象又发生变化的情况,若打开此开关,可在一定程度上降低CMS重新标记阶段对上述“又发生变化”对象的扫描时间,当然,“清除尝试”也会消耗一些时间
注意:开启此开关并不会保证在标记阶段前一定会进行清除操作
cms gc会以新生代作为GC ROOT的一部分,在remark之前,做一次young gc,回收到新生代大部分对象,减少gc root的开销 -- 解决cms remark时间过长
XX:+UseGCOverheadLimit 默认开启 ,如果GC时间过长,抛出oom
其他参数
-XX:+PrintCompilation 打印jit代码
-XX:CompileThreshold JIT编译的阈值,server模式10000,client模式1500,当函数调用超过该阈值时,JIT将字节码编译成本地机器码
编译器产生的本地代码会比Javac 产生的字节码更加优秀
锁参数
-XX:-UseBiasedLocking 禁用偏向锁
-XX:+EliminateLocks 开启锁消除
逃逸分析
-XX:+DoEscapeAnalysis 开启逃逸分析
-XX:+PrintEscapeAnalysis 开启逃逸分析后,可通过此参数查看分析结果
-XX:+EliminateAllocations 开启标量替换
-XX:+EliminateLocks 开启同步消除
-XX:+PrintEliminateAllocations 开启标量替换后,查看标量替换情况
\Java\jdk1.8.0_121\jre\lib\amd64\jvm.cfg
-server KNOWN
-client IGNORE
Client VM:为在客户端环境中减少启动时间而优化
Server VM:为在服务器环境中最大化程序执行速度而设计,-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升
常见问题
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:\\oom
发生oom以后,进程继续运行,不生成dump文件
参考:https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
https://blog.csdn.net/ning0323/article/details/76505378