申明:文章内容是本人学习极客时间课程所写,作为笔记进行记录,文字和图片基本来源于课程资料,在某些地方会插入一点自己的理解,未用于商业用途,侵删。
原资料地址:课程资料
JVM参数
标准参数
定义:稳定的参数不会随着Java版本的变化而变化。通常以 短横线开头,可以通过java -help 查看
java -version
非标准参数
定义:以-X开头,是标准参数的扩展。表示在将来的JVM版本中可能会发生改变,但是这类以-X开始的参数变化比较小。通过java -X 查看
比较常见的非标准参数:
- -Xms堆最小值:默认值是总内存/64(且小于1G),默认情况下,当堆中可用内存小于40%(-XX: MinHeapFreeRatio调整)时,堆内存会开始增加,一直增加到-Xmx大小。
- -Xmx堆最大值:默认值是总内存/64(且小于1G),如果Xms和Xmx都不设置,则两者大小会相同,默认情况下,当堆中可用内存大于70%时,堆内存会开始减少,一直减小到-Xms的大小;
- -Xmn新生代内存:默认是整堆的1/3,包括Eden区和两个Survivor区的总和,写法如: -Xmn1024,-Xmn1024k,-Xmn1024m,-Xmn1g 。新生代按整堆的比例分配,所以,此值不建议设置!
- -Xss线程栈内存:默认1M,一般来说是不需要改的。
- 打印GC日志·-Xloggc:file与-verbose:gc功能类似,只是将每次GC事件的相关情况记录到一个文件中。
不稳定参数
这也是非标准化参数,相对来说不稳定,随着JVM版本的变化可能会发生变化,主要用于JVM调优和debug。
不稳定参数以-XX 开头,此类参数的设置很容易引起JVM 性能上的差异,使JVM存在极大的不稳定性。如果此类参数设置合理将大大提高JVM的性能及稳定性。
不稳定参数分为三类:
- 性能参数:用于JVM的性能调优和内存分配控制,如内存大小的设置;
- 行为参数:用于改变JVM的基础行为,如GC的方式和算法的选择;
- 调试参数:用于监控、打印、输出jvm的信息;
不稳定参数语法规则:
- 布尔类型参数值:
-XX:+
'+'表示启用该选项
-XX:-
'-'表示关闭该选项
示例:-XX:+UseG1GC:表示启用G1垃圾收集器 - 数字类型参数值:
-XX:
=给选项设置一个数字类型值,可跟随单位,例如:'m’或’M’表示兆字节;'k’或’K’千字节;'g’或’G’千兆字节。32K与32768是相同大小的。
示例:-XX:MaxGCPauseMillis=500 :表示设置GC的最大停顿时间是500ms - 字符串类型参数值:
-XX:
=给选项设置一个字符串类型值,通常用于指定一个文件、路径或一系列命令列表。
示例:-XX:HeapDumpPath=./dump.core
常用的不稳定参数:
-XX:+UseSerialGC 配置串行收集器
-XX:+UseParallelGC 配置PS并行收集器
-XX:+UseParallelOldGC 配置PO并行收集器
-XX:+UseParNewGC 配置ParNew并行收集器
-XX:+UseConcMarkSweepGC 配置CMS并行收集器
-XX:+UseG1GC 配置G1并行收集器
-XX:+PrintGCDetails 配置开启GC日志打印
-XX:+PrintGCTimeStamps 配置开启打印GC时间戳
-XX:+PrintGCDateStamps 配置开启打印GC日期
-XX:+PrintHeapAtGC 配置开启在GC时,打印堆内存信息
什么时候进行JVM调优?
- 系统吞吐量下降与响应延迟(P99);
- Heap内存(老年代)持续上涨至出现OOM;
- Full GC 次数频繁;
- GC 停顿过长(超过1秒);
- 应用出现OutOfMemory 等内存异常;
- 应用中有使用本地缓存且占用大量内存空间;
调优调什么?
内存分配 + 垃圾回收
- 合理使用堆内存
- GC高效回收占用的内存的垃圾对象
- GC高效释放掉内存空间
JVM实践调优主要步骤
第一步:监控分析GC日志
第二步:判断JVM问题:
如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化
如果GC时间超过1秒,或者频繁GC,则必须优化。
第三步:确定调优目标
第四步:调整参数
调优一般是从满足程序的内存使用需求开始,之后是时间延迟需求,最后才是吞吐量要求,要基于这个步骤来不断优化,每一个步骤都是进行下一步的基础,不可逆行之。
第五步:对比调优前后差距
第六步:重复:1、2、3、4、5步骤
找到最佳JVM参数设置
第七步:应用JVM参数到应用服务器:
找到最合适的参数,将这些参数灰度发布一部分机器,观察一段时间。
如果,观察结果可以验证方案的价值,则进行全量发布!
这是一些调优的基础知识和方法论,真正的能够调优还是要结合实际情况去练习,后续会单独写文章来记录调优的案例。