JVM参数及调优(原则上要看官方文档调优)


一、调优的三个组件

堆大小调整

垃圾收集器调整

JIT编译器

大多数调优选项都是调整堆大小和选择最合适的垃圾收集器有关。
JIT编译器对性能也有很大影响,但很少需要使用较新版本的JVM进行调优。


二、调优目标

1、响应性

应用程序或系统对请求的数据进行响应的速度,对于专注于响应性的应用程序,长的暂停时间是不可接受的,重点是在短时间内做出回应。

2、吞吐量

侧重于在特定时间段内最大化应用程序的工作量,对于专注于吞吐量的应用程序,高暂停时间是可接受的。
由于高吞吐量应用程序在较长时间内专注于基准测试,因此不需要考虑快速响应时间。

三、常用JVM参数

-XX:+AlwaysPreTouch jvm启动时分配内存,非使用时再分配
-XX: ErrorFile = filename 崩溃日志
-XX:+TraceClassLoading 跟踪类加载信息
-XX:+PrintClassHistogram 按下Ctrl+Break后,打印类的信息
-Xmx -Xms 最大堆和最小堆
-xx:permSize、-xx:metaspaceSize 永久代/元数据空间
XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件
XX:+HeapDumpPath OOM时堆导出的路径
XX:OnOutOfMemoryError 在OOM时,执行一个脚本
java-XX:+PrintFlagsFinal-version 打印所有的-XX参数和默认值

版本不断更新,JVM参数和具体说明,建议需要时参考oracle官网的手册。


四、GC调优思路

1.分析场景
例如:启动速度慢;偶尔出现响应慢于平均水平或者出现卡顿

2.确定目标
内存占用、低延时、吞吐量

3.收集日志
(1)通过参数配置收集GC日志
(2)通过JDK工具查看GC状态 :jstat查看 gc实时执行情况、GCview查看离线GC日志。

4.分析日志
使用工具辅助分析日志,查看GC次数,GC时间

5.调整参数
切换垃圾收集器或者调整垃圾收集器参数


五、通用GC参数

参数说明
-XX:ParallelGCThreads并行GC线程数量
-XX:ConcGCThreads并发GC线程数量
-XX:MaxGCPauseMillis最大停顿时间,单位毫秒。GC尽力保证回收时间不超过设定值
-XX:GCTimeRatio0-100的取值范围垃圾收集时间占总时间的比默认99,即最大允许1%时间做GC
-XX:SurvivorRatio设置Eden区大小和Survivor区大小的比例。8表示两个Survivor:Eden=2:8,即一个Survivor占年轻代的1/10
-XX:NewRatio新生代和老年代的比。4表示新生代:老年代=1:4,即年轻代占堆的1/5
-verbose:gc、-X:+printGC打印GC的简要信息
XX:+PrintGCDetails打印GC详细信息(jdk9去掉)
XX:+PrintGCTimeStamps打印CG发生的时间戳(jdk9去掉)
-Xloggc:log/gc.log指定GClog的位置,以文件输出
-XX:+PrintHeapAtGC每次一次GC后,都打印堆信息

六、各垃圾收集器参数调优

1、Parallel

1、JDK默认收集器。2、 **吞吐量优先**
参数说明
-XX:+UseParallelGC新生代使用并行回收收集器
-XX:+UseParallelOldGC老年代使用并行回收收集器
-XX:ParallelGCThreads设置用于垃圾回收的线程数
-XX:+UseAdaptiveSizePolicy打开自适应 GC 策略

2、CMS(jdk1.9废弃)

1、响应时间优先
2、Parallel GC无法满足应用程序延迟要求时再考虑使用CMS垃圾收集器
3、新版建议用G1垃圾收集器
参数说明
-XX:+UseConcMarkSweepGC新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:+UseParNewGC在新生代使用并行收集器,CMS下默认开启
-XX:CMSInitiatingOccupancyFraction设置触发GC的闯值 默认68%如果不幸内存预留空间不够,就会引起concurrent mode failure
-XX:+ UseCMSCompactAtFullCollectionFull GC后,进行一次整理,整理过程是独占的,会引起停顿时间变长
-XX:+CMSFullGCsBeforeCompaction设置进行几次Full GC后,进行一次碎片整理
-XX:+CMSClassUnloadingEnabled允许对类元数据进行回收
-XX:+UseCMSInitiatingOccupancyOnly表示只在到达阀值的时候,才进行CMS回收
XX:+CMSIncrementalMode使用增量模式,比较适合单 CPU

3、G1

1、兼顾吞吐量和响应时间
2、超过50%的Java堆被实时数据占用
3、建议大堆(约为6G或以上)
4、GC延迟要求有限的应用(稳定且可预测的暂停时间低于0.5秒)
参数说明
XX:G1HeapRegionSize=<N,例如 16>M设置 region 大小,默认heap/2000
-XX:G1MixedGCLiveThresholdPercent老年代依靠Mixed GC,触发闻值
-XX:G1OldCSetRegionThresholdPercent定多被包含在一次 Mixed GC中的region 比例
XX:+ClassUnloadingWithConcurrentMarkG1增加并默认开启,在并发标记阶段结束后,JVM 即进行类型卸载。
-XX:GINewSizePercent新生代的最小比例
-XX:G1MaxNewSizePercent新生代的最大比例
XX:G1MixedGCCountTargetMixed GC 数量控制

七、 运行时JIT编译器参数调优

T编译指的是字节码编译为本地代码(汇编)执行,只有热点代码才会编译成本地代码。解释器执行节约内存,反之可以使用编译执行来提升效率

参数 说明
-XX:+AggressiveOpts 允许jvm使用积极的性能优化功能
-XX:-TieredCompilation 分层编译,jdk8默认开启,jdk7默认关闭
-Xmaxjitcodesize、-XX:ReservedCodeCacheSize 指定JIT编译代码的最大代码高速缓存最大值
-Xmixed 除了热方法之外,解释器执行所有字节码,热方法被编译成本地代码
-XX:InitialCodeCacheSize 初始化编译后的汇编指令,缓存区大小,字节
-XX:+PrintCompilation 打开编译日志
-XX:CICompilerCount JIT编译所使用的线程数量
-XX:+DoEscapeAnalysis 逃逸分析,默认打开,对代码的深度优化
-XX:-Inline 方法内联,默认打开
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值