一、实施过程中的原则

在调优之前,我们需要记住下面的原则:

1、在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合)。

2、多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题。同时多数的Java应用不需要在服务器上进行GC优化。

3、减少使用全局变量和大对象,同时注意减少创建对象的数量;这也是Spring框架单例模式的一个优点。

4、在实际使用中,分析GC情况优化代码比优化GC参数要多得多,GC优化往往是最后的手段;

二、GC优化流程

GC频率不高,GC耗时不高,那么没有必要进行GC优化;如果GC时间超过1-3秒,或者频繁GC,则必须优化。指标参考:

a.Minor GC执行时间不到50ms;

b.Minor GC执行不频繁,约10秒一次;

c.Full GC执行时间不到1s;

d.Full GC执行频率不算频繁,不低于10分钟1次;

1、性能定义:

①内存占用:垃圾收集器流畅运行所需要的内存数量。

②延迟:其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿,避免应用运行时发生抖动。

③吞吐量:指单位时间内系统处理用户的请求数。此处需要满足不考虑垃圾收集引起的停顿时间或内存消耗,能支撑应用达到的最高性能指标。

这三个属性中,其中一个任何一个属性性能的提高,几乎都是以另外一个或者两个属性性能的损失作代价,不可兼得,具体某一个属性或者两个属性的性能对应用来说比较重要,要基于应用的业务需求来确定。另外调优一般是从满足程序的内存使用需求开始的,之后是时间延迟的要求,最后才是吞吐量的要求,要基于这个步骤来不断优化,每一个步骤都是进行下一步的基础,不可逆行之。

2、调优过程中的原则

a.每次minor GC都要尽可能多的收集垃圾对象,以减少应用程序发生Full GC的频率。将转移到老年代的对象数量降低到最小,减少Major GC/Full GC的执行时间。解决方法如下:

①调整新生代的大小到最合适;

②选择合适的GC收集器;

③设置老年代的大小为最合适;

④减少使用全局变量和大对象;

b.GC内存最大化原则:处理吞吐量和延迟问题时候,垃圾处理器能使用的内存越大,垃圾收集的效果越好,应用程序也会越来越流畅。

c.在性能属性里面,吞吐量、延迟、内存占用,我们只能选择其中两个进行调优,不可三者兼得。

jvm调优是根据性能测试结果不断优化配置而多次迭代的过程。在达到每一个系统需求指标之前,之前的每个步骤都有可能经历多次迭代。

参考:https://www.cnblogs.com/xiaopaipai/p/10522794.html

三、内存调优

通过在Tomcat的bin目录下的catalina.bat或catalina.sh文件中添加GC日志文件或者使用其他工具得到应用Full GC的日志信息。此处的Full GC必须是在满足应用需求的最高峰时期的GC日志,且满足如下测试需求:

1.测试时,启动参数采用JVM默认参数,不人为设置。

2.确保Full GC发生时,应用程序正处于稳定阶段。

主要需要了解的参数是:

1、年轻代使用内存大小。建议设置:1-1.5倍FullGC之后的老年代空间占用。

2、老年代使用内存大小。2-3倍FullGC后的老年代空间占用。

3、永久代使用内存大小。1.2-1.5倍FullGc后的永久带空间占用。

4、堆内存使用大小。3-4倍FullGC后的老年代空间占用。

PS:此处的内存调优是满足了内存的基本需求,但并不一定满足延迟和吞吐量的需求。

四、延迟调优

最佳实践是将花费在垃圾收集上的时间调整为执行时间的5%以内。JVM堆大小决定了JVM收集垃圾的频率和时间。可接受的垃圾收集速率是基于应用程序的需求,应在分析垃圾收集的实际时间和频率之间进行调整。如果设置较大的堆大小,则完全垃圾收集的速度较慢,但​​发生频率较低。如果根据内存需求设置堆大小,则完全垃圾收集会更快,但会更频繁地发生。但调整堆大小的目标是最大程度地减少JVM用于进行垃圾收集的时间,同时最大程度地增加程序执行业务逻辑的时间。为了确保基准测试期间的最佳性能,您可以设置较高的堆大小值,以确保在整个基准测试过程中不会进行垃圾回收。

在确定了应用程序的内存调优数据大小之后,我们需要再进行延迟性调优,因为对于此时堆内存大小,延迟性需求无法达到应用的需要,需要基于应用的情况来进行调试。这一步进行期间,我们可能会再次优化堆大小的配置,评估GC的持续时间和频率、以及是否需要切换到不同的垃圾收集器上。

在调优之前,我们需要知道系统的延迟需求是那些,以及对应的延迟可调优指标是那些。

a.应用程序可接受的平均停滞时间(重点关注): 此时间与测量的Minor GC持续时间进行比较。

b.可接受的Minor GC频率:Minor GC的频率与可容忍的值进行比较。

c.可接受的最大停顿时(重点关注):最大停顿时间与最差情况下Full GC的持续时间进行比较。

d.可接受的最大停顿发生的频率:基本就是Full GC的频率。

基于以上的要求,我们需要统计以下数据:

a.Minor GC的持续时间;

b.统计Minor GC的次数;

c.Full GC的最差持续时间;

d.最差情况下,Full GC的频率;

获取GC时间,通过jconsole工具可以获取程序运行时间,通过jstat -gcutil PID号 250 10可以获取GC时间并计算GC数据:

Minor GC平均耗时=YGCT/YGC(s)=0.021/3=0.007ms

Minor GC时间间隔=程序的运行时间/YGC=(30*60)/3=600S

Full GC平均耗时=FGCT/FGC(s)=0.03/1=0.03ms

Full GC时间间隔=程序的运行时间/FGC=(30*60)/1=1800S

1、年轻代大小调整说明:年轻代空间越大,Minor GC的GC时间越长,频率越低。如果想减少其持续时长,就需要减少其空间大小(按一定比例减少,否则将会过大增加GC频次,GC时间无优化效果)。如果想减小其频率,就需要加大其空间大小(按一定比例增加,否则将会过大增加GC时间,最大停顿时间明显)。

2、老年代大小调整说明:可以调整老年代的大小来调整Full GC的频率,如果FullGC持续时间过长,无法达到应用程序的最差延迟要求,就需要切换垃圾处理器,如切换为CMS。

3、最佳实践:

a.为了确保基准测试期间的最佳性能,您可以设置较高的堆大小值,以确保在整个基准测试过程中不会进行垃圾回收。

b.建议设置最小堆大小等于最大堆大小以最大程度地减少垃圾收集以及减少系统调整JVM资源的时间。

五、吞吐量调优

吞吐量调优主要是基于应用程序的吞吐量(例如每小时批处理系统能完成的任务数量,在吞吐量方面优化的系统,较长的 GC 停顿时间也是可以接受的)要求而来的,应用程序有一个综合的吞吐指标,这个指标基于整个应用的需求和测试而衍生出来的。当有应用程序的吞吐量达到或者超过预期的吞吐目标,整个调优过程就可以圆满结束了。如果出现调优后依然无法达到应用程序的吞吐目标,需要重新回顾吞吐要求,评估当前吞吐量和目标差距是否巨大,如果在20%左右,可以修改参数,加大内存,再次从头调试,如果巨大就需要从整个应用层面来考虑,设计以及目标是否一致了,重新评估吞吐目标。

对于JVM调优来说,提升吞吐量的性能调优的目标就是就是尽可能避免或者很少发生FullGC 或者Stop-The-World压缩式垃圾收集(CMS),因为这两种方式都会造成应用程序吞吐量降低。尽量在Minor GC阶段回收更多的对象,避免对象提升过快到老年代。

六、选择合适的垃圾收集器

进行JVM调优时除了针对GC的次数和持续时间针对吞吐量、延迟进行的调优,还需要选择合适的垃圾回收器。

JVM参数调优参考:https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

JVM调优-调优原则与思路相关推荐

  1. Tomcat性能调优-JVM监控与调优

    参数设置 在Java虚拟机的参数中,有3种表示方法用"ps -ef |grep "java"命令,可以得到当前Java进程的所有启动参数和配置参数: 标准参数(-),所有 ...

  2. Java系列笔记(4) - JVM监控与调优【转】

    Java系列笔记(4) - JVM监控与调优[转] 目录 参数设置 收集器搭配 启动内存分配 监控工具和方法 调优方法 调优实例       光说不练假把式,学习Java GC机制的目的是为了实用,也 ...

  3. [java] JVM监控与调优

    原文出处:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html   光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分 ...

  4. JVM原理和调优的理解和学习

    JVM原理和调优的理解和学习 一.详解JVM内存模型 二.JVM中一次完整的GC流程是怎样的 三.GC垃圾回收的算法有哪些 四.简单说说你了解的类加载器 五.双亲委派机制是什么,有什么好处,怎么打破 ...

  5. jvm与Tomcat调优【详解】——有这一篇就够了

    jvm与Tomcat调优 一.JVM性能调优 1.1 什么是JVM? 1.2 JVM调优工具 1.3 JVM调优经验 1.4常用JVM参数参考: 1.5 Java文件编译的过程 1.6 为什么说jav ...

  6. Java生产环境下性能监控与调优详解 第7章 JVM层GC调优

    第7章 JVM层GC调优 7-1 JVM的内存结构 7-2 常见的垃圾回收算法 7-3 垃圾收集器-1 7-4 垃圾收集器-2 7-5 GC日志格式详解 7-6 可视化工具分析GC日志 7-7 Par ...

  7. JVM原理及调优--网页链接收藏

    此篇用于收藏大神们关于JVM原理及调优通俗易懂的文章链接,用于随时查看 JVM调优总结 JVM参数配置大全 JVM调优:选择合适的GC collector 菜菜鸟想了解下大概的JVM内存模型可以看这个 ...

  8. 2020年薪30W的Java程序员都要求熟悉JVM与性能调优!

    前言 作为Java程序员,你有没有被JVM伤害过?面试的时候是否碰到过对JVM的灵魂拷问? 一.JVM 内存区域划分 1.程序计数器(线程私有) 程序计数器(Program Counter Regis ...

  9. 【JVM】四、JVM优化-GC调优

    传送门 [JVM]一.JVM体系结构 [JVM]二.JVM垃圾收集器 [JVM]三.JVM内存溢出问题分析查看 [JVM]四.JVM优化-GC调优 上一篇:[JVM]三.JVM内存溢出问题分析查看 文 ...

  10. JVM体系结构与调优

    JVM GC与调优 前言 一.JVM体系结构概述 二.GC算法 三.HotSpot内存管理 四.HotSpot垃圾回收器 五.调优 六.监控工具 前言 本文章来自一篇参考,学习实践. 一.JVM体系结 ...

最新文章

  1. 一般家用监控多少钱_家用煤气灶价格一般是多少 燃气灶安装的流程
  2. 一道题,最小操作次数使数组元素相等引发的思考
  3. 计算机操作系统作业答案,计算机操作系统作业及答案
  4. JavaScript 高级——详谈面向对象
  5. c 结构体在声明时赋值_C/C++编程笔记:C++入门知识,C++多态性和虚函数解析
  6. mybatis中LIKE模糊查询的几种写法以及注意点
  7. Node.js 使用jQuery取得Nodejs http服务端返回的JSON对象示例
  8. onenote快捷键_onenote链接系列:链接笔记如何产生?与插入链接的区别
  9. 【工程项目经验】Centos 编译32位程序
  10. BootDo平台数据库使用Oracle
  11. 蝙蝠算法c语言,求解0-1背包问题的二进制蝙蝠算法
  12. Linux: Manjaro/Arch logiops 罗技鼠标驱动安装教程
  13. 面包板的使用-----看板子反面即可
  14. 计算机窗口显示不出来的,任务栏不显示打开的窗口,详细教您打开的窗口在任务栏上显示不出来...
  15. EF Core 新特性——Owned Entity Types
  16. Benchmarking Learned Indexes(VLDB2021)
  17. 【浏览器兼容性】如何隐藏微软的ie和edge浏览器密码输入框的小眼睛
  18. iOS小技能:地址选择器(支持省份,省市,省市区,支持显示上一次选择的地址)
  19. 找一找马里奥-第14届蓝桥杯STEMA测评Scratch真题精选
  20. AD21调整PCB大小操作步骤!

热门文章

  1. 勤能补拙是良训,一分辛劳一分才【自学自检共勉】第一篇博客~
  2. 高博SLAM第十章优化代码出错解决办法
  3. 缺氧游戏超级计算机在哪里研究,缺氧小人属性选择指南
  4. 《程序员》杂志试刊一发刊词
  5. 计算机原理实验报告三,计算机组成实验报告3
  6. surf匹配流程。。。
  7. mysql 图形插件_ECharts绘图解决方案——流动关系图(桑基图)
  8. PGL图神经网络节点分类流程
  9. AIS数据下载并处理(python)
  10. 浏览器之战将进入HTML5时代