JVM参数及调优

  1. 调优基本概念
  2. 常用JVM参数
  3. GC调优思路
  4. 通用GC参数
  5. 垃圾收集器CMS参数调优
  6. 垃圾收集器G1参数调优
  7. 运行时JIT编译器参数调优

1 调优基本概念

在调整性能时,JVM有三个组件:

  1. 堆大小调整
  2. 垃圾收集器调整
  3. JIT编译器

在调优java应用程序时,重点是以下两个主要目标之一
响应性:应用程序或系统对请求的数据进行相应的速度,对于专注于响应性的应用程序,长的暂停时间是不可接受的,重点是在段时间内做出回应。
吞吐性:侧重于在特定时间段内最大化应用程序的工作量,对于专注于吞吐量的应用程序,高暂停事件是可接受的,由于高吞吐量应用程序在较长时间内专注于基准测试,因此不需要考虑快速响应时间。

2 常用JVM参数

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

3 GC调优思路

  1. 分析场景:例如,启动速度慢,偶尔出现响应慢于平均水平或者出现卡顿。
  2. 确定目标:内存占用、低延迟、低吞吐量。
  3. 收集日志:通过参数配置收集GC日志,通过JDK工具查看GC状态。
  4. 分析日志:使用工具辅助分析日志,查看GC次数,GC时间。
  5. 调整参数:切换垃圾收集器或者调整垃圾收集器参数。

4 通用GC参数

参数说明
-XX:ParallelGCThreads并行GC线程数量
-XX:ConcGCThreads并发GC线程数量
-XX:MaxGCPauseMills最大停顿时间,单位毫秒,GC尽力保证回收时间不超过设定值
-XX:GCTimeRatio垃圾收集时间占总时间的比
-XX:SurvivorRatio设置Eden区大小和Survivor区大小的比例
-XX:NewRatio新生代和老年代的比
-verbose:gc、-XX:+printGC打印GC的简要信息
-XX:+PrintGCDetails打印GC详细信息
-XX:+PrintGCTimeStamps打印GC发生的时间戳
-Xloggc:log/gc.log指定GC log的位置,以文件输出
-XX:+PrintHeapAtGC每次GC后,都打印堆信息

5 垃圾收集器CMS参数调优

  1. 响应时间优先
  2. Parallel GC无法满足应用程序延迟要求时再考虑使用CMS垃圾收集器
  3. 新版建议用G1垃圾收集器
参数说明
-XX:+UseConcMarkSweepGC新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:+UseParNewGC在新生代使用并行收集器,CMS默认开启
-XX:CMSInitiatingOccupancyFraction设置触发GC的阈值,默认68%
-XX:+UseCMSCompactAtFullCollectionFull GC后,进行一次整理
-XX:+CMSFullGCsBeforeCompaction设置进行几次Full GC后,进行一次碎片整理
-XX:+CMSClassUnloadingEnabled允许对类元数据进行回收
-XX:+UseCMSInitiatingOccupancyOnly表示只在到达阈值的时候,才进行CMS回收
-XX:+CMSIncrementalMode使用增量模式,比较适合单CPU

6 垃圾收集器G1参数调优

  1. 兼顾吞吐量和响应时间
  2. 超过50%的Java堆被实时数据占用
  3. 建议大堆(大小约6GB或更大)
  4. 且GC延迟要求有限的应用(稳定且可预测的暂停时间低于0.5秒)
参数说明
-XX:G1HeapRegionSize=<N设置region大小
-XX:G1MixedGCLiveThreholdPercent老年代依靠Mixed GC
-XX:G1OldCSetRegionThreholdPercent
-XX:+ClassUnloadingWithConcurrentMarkG1增加并默认开启,在并发标记阶段结束后,JVM即进行类型卸载
-XX:G1NewSizePercent新生代的最小比例
-XX:G1MaxNewSizePercent新生代的最大比例
-XX:G1MixedGCCountTargetMixed GC数量控制

7 运行时JIT编译器参数调优

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

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

参考文章

网易云课堂《Java高级开发工程师》

结语

本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值