Java教程

JVM和数据库调优方案

本文主要是介绍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)
这篇关于JVM和数据库调优方案的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!