微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JVM和数据库调优方案

1、JVM调优方案

将新对象预留在新生代

  • Full GC的成本远远高于Minor GC,新生代的回收速度高于老年代回收,因此尽可能将对象分配在新生代
  • 为应用程序分配一个合理的新生代空间,最大限度避免新对象直接进入老年代
    -Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn
  • 防止survivor from区数据直接进入老年代,增大from区或者增大from区利用率
    增大from区:-XX:SurvivorRation=8 这是认值 Eden:from:to=8:1:1 一般不采用这种情况
    增大from区利用率:认是50%,-XX:TargetSurvivorRatio=90,利用率达到90%后回收

大对象进入老年代

  • 大对象出现在新生代会扰乱新生代GC,破坏新生代原有对象结构,因为大对象进来后会移动大量小的年轻对象进入老年代
  • 避免出现短命的大对象,应该由开发人员规避
  • -XX:PretenureSizeThreshold=1000000设置大对象进入老年代的阙值,1MB以上的对象进入老年代

设置对象进入老年代的年龄

  • 认值是15
  • -XX:MaxTenuringThreshold来设置年龄,但这个设置的值,不一定是真正的年龄值,因为JVM也会根据运行时内存的使用情况动态计算,动态计算得出的值和设置的值比较拿较小值设为 对象进入老年代的年龄
  • 可以调大一些,让对象尽可能的停留在新生代

考虑稳定和震荡的堆大小

  • 一般-xms和-Xmx大小保持一致,这样系统在运行时堆大小是恒定的,稳定的堆空间可以减少GC次数
  • 但是稳定的堆空间也有一个坏处,那就是单次GC时间可能会变大,基于此考虑 JVM也提供了两个参数
    -XX:MinHeapFreeRatio:堆空间最小空闲比例,认40,当堆空间空闲内存小于这个数值时,JVM会扩展堆空间
    -XX:MaxHeapFreeRatio:堆空间最大空闲比例,认70,当堆空间空闲内存大于这个数值时,便会压缩堆空间

两个参数只有在-Xmx和-xms不等时生效

基于吞吐量的考虑

尽可能减少系统执行垃圾回收的总时间,使用并行回收收集器,
假如运行内存4G,32核cpu

  • -Xmx3800m和-xms3800m保持一致,避免堆内存频繁震荡
  • -Xss128k,减少线程栈大小,可以使系统内存支持更多线程
  • -Xmn2g:设置新生代大小 新生代大一些
  • -XX:+UseParallelGC:新生代使用并行回收收集器
  • -XX:ParallelGCThreads:垃圾回收的线程数 一般可以和cpu数保持一致,如果cpu数比较大,可以适当小一些
  • -XX:+UseParallelOldGC:老年代使用并行回收收集器

基于降低停顿的考虑

首先考虑关注系统停顿的CMS收集器

  • -XX:ParallelGCThreads:垃圾回收的线程数
  • -XX:+UseParNewGC:新生代使用并行回收收集器,与UseParallelGC的区别在于,它可以与CMS收集同时使用,是UseParallelGC的升级版本,手动开启
  • -XX:+UseConcmarkSweepGC:老年代使用CMS收集器降低停顿
  • -XX:SurvivorRatio:设置survivor比例
  • -XX:TargetSurvivorRatio,设置survivor区的使用率
  • XX:MaxTenuringThreshold:摄者年轻对象晋升老年代的年龄 认15,改为30

跳过class校验认证(提高启动速度)

由于JVM虚拟机在加载类时,出于安全考虑,会对class进行校验和认证,如果类文件是可信任的,为了加快程序的运行速度,可以考虑禁用这些校验
-Xverify:none

控制GC(提高启动速度)

  • 禁用显示的GC操作:例如Sysytem.gc()来触发Full GC ,-XX:disableExplicitGC
  • 若涉及不到动态生成类这些操作,可以指定不进行类回收,可以使用-Xnoclassgc启动应用程序

综上所述,JVM调优一般有以下几个过程

  1. 确定堆内存大小(-Xmx、-xms
  2. 合理分配新生代和老年代(-XX:NewRatio、-Xmn、-XX:SurvivorRatio)
  3. 确定永久区大小(-XX:Permisize、-XX:MaxPermSize)
  4. 选择垃圾收集器
  5. 垃圾收集器进行合理配置
  6. 禁用显示GC(-XX:+disableExplicitGC)
  7. 禁用类元数据回收(-Xnoclassgc)
  8. 禁用类验证(-Xverify:none)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐