简单的JVM调优

╰+攻爆jí腚メ 2023-09-30 08:31 36阅读 0赞

8:1:1更健康

堆中三个区域:Eden、From Survivor、To Survivor。从图中可以也可以看到它们的大小比例,准确来说是:8:1:1

JVM参数参数" class="reference-link">在这里插入图片描述 JVM参数参数

在这里插入图片描述
控制参数详解:

  • Xms设置堆的最小空间大小。
  • Xmx设置堆的最大空间大小。
  • Xmn堆中新生代初始及最大大小(NewSize和MaxNewSize为其细化)。
  • XX:NewSize设置新生代最小空间大小。
  • XX:MaxNewSize设置新生代最大空间大小。
  • XX:PermSize设置永久代最小空间大小。
  • XX:MaxPermSize设置永久代最大空间大小。
  • Xss设置每个线程的堆栈大小。

什么情况进行调优

遇到以下情况,就需要考虑进行JVM调优了:

  • Heap内存(老年代)持续上涨达到设置的最大内存值;
  • Full GC 次数频繁
  • GC 停顿时间过长(超过1秒);
  • 应用出现OutOfMemory 等内存异常;
  • 应用中有使用本地缓存且占用大量内存空间;
  • 系统吞吐量与响应性能不高或下降。
  • JVM调优的基本原则
  • JVM调优是一个手段,但并不一定所有问题都可以通过JVM进行调优解决,

因此,在进行JVM调优时,我们要遵循一些原则:

  • 大多数的Java应用不需要进行JVM优化;
  • 大多数导致GC问题的原因是代码层面的问题导致的(代码层面);
  • 上线之前,应先考虑将机器的JVM参数设置到最优
  • 减少创建对象的数量(代码层面);
  • 减少使用全局变量和大对象(代码层面);
  • 优先架构调优和代码调优,JVM优化是不得已的手段(代码、架构层面);
  • 分析GC情况优化代码比优化JVM参数更好(代码层面);

通过以上原则,我们发现,其实最有效的优化手段是架构和代码层面的优化,而JVM优化则是最后不得已的手段,也可以说是对服务器配置的最后一次“压榨”。

JVM调优目标

调优的最终目的都是为了令应用程序使用最小的硬件消耗来承载更大的吞吐。jvm调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量。

  • 延迟:GC低停顿和GC低频率;
  • 低内存占用;
  • 高吞吐量;
    其中,任何一个属性性能的提高,几乎都是以牺牲其他属性性能的损为代价的,不可兼得。具体根据在业务中的重要性确定。

JVM调优量化目标

下面展示了一些JVM调优的量化目标参考实例:

  • Heap 内存使用率 <= 70%;
  • Old generation内存使用率<= 70%;
  • avgpause <= 1秒;
  • Full gc 次数0 或 avg pause interval(stw) >= 24小时 ;

注意:不同应用的JVM调优量化目标是不一样的。

JVM调优的步骤

一般情况下,JVM调优可通过以下步骤进行:

  1. 分析GC日志及dump文件,判断是否需要优化,确定瓶颈问题点;
  2. 确定JVM调优量化目标;
  3. 确定JVM调优参数(根据历史JVM参数来调整);
  4. 依次调优内存、延迟、吞吐量等指标;
  5. 对比观察调优前后的差异;
  6. 不断的分析和调整,直到找到合适的JVM参数配置;
  7. 找到最合适的参数,将这些参数应用到所有服务器,并进行后续跟踪。
  8. 以上操作步骤中,某些步骤是需要多次不断迭代完成的。一般是从满足程序的内存使用需求开始的,之后是时间延迟的要求,最后才是吞吐量的要求,要基于这个步骤来不断优化,每一个步骤都是进行下一步的基础,不可逆行之。

GC垃圾回收器

在这里插入图片描述
JDK1.8 使用默认参数的java应用使用的GC组合是
Parallel Scavenge (新生代) 和 Parallel Old (老年代)









































新生代(别名) 老年代 JVM 参数
Serial (DefNew) Serial Old(PSOldGen) -XX:+UseSerialGC
Parallel Scavenge (PSYoungGen) Serial Old(PSOldGen) -XX:+UseParallelGC
Parallel Scavenge (PSYoungGen) Parallel Old (ParOldGen) -XX:+UseParallelOldGC
ParNew (ParNew) Serial Old(PSOldGen) -XX:-UseParNewGC
ParNew (ParNew) CMS+Serial Old(PSOldGen) -XX:+UseConcMarkSweepGC
G1 G1 -XX:+UseG1GC

优化的重点

举个栗子" class="reference-link">在这里插入图片描述 举个栗子

优化前:
在这里插入图片描述
在这里插入图片描述
优化后:
伊甸园和新生代保持8:1:1
在这里插入图片描述

总结" class="reference-link">在这里插入图片描述 总结

业务预估,参数设置,年轻代提早干掉,不去到老年代。尽量触发minor GC,但不触发Full GC,不触发STW否则会有卡顿。

发表评论

表情:
评论列表 (有 0 条评论,36人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jvm

     最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录。 一、JVM内存模型及垃圾收集算法  1.根据Java虚拟机规范,JVM将内存划分为:

    相关 JVM

    一、JVM调优的监控方法 jvm在对进行问题排查,线程等关注问题,在理解jvm的内存分配和垃圾回收,java类的编译和加载等等理论知识的前提下要学会使用工具去观察jvm中的实

    相关 JVM

    1. 年轻代大小选择 (1) 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到

    相关 spark JVM

    我们的堆内存分为:新生代,和年老代, 年轻代又分为:Eden区,幸存一区,幸存二区, 每一次访对象的时候,都是放入eden区域,和其中的一个幸存一区中,幸存二区是不放对象的

    相关 JVM

    前提: 某大型跨境电商业务发展非常快,线上机器扩容也很频繁,但是对于线上机器的运行情况,特别是jvm内存的情况,一直没有一个统一的标准来给到各个应用服务的owner。经过6

    相关 JVM

    年轻代大小选择 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对

    相关 JVM

    JVM调优是所有初级程序员向高级迈入的必经之路,而这个过程又需要许多JVM内存知识。下面就总结一二,和大家分享一下: 1.JVM内存模型 JVM内存模型如下图所示: