文章目录

  • 1. jvm调优思路
  • 2. 订单的秒杀模块jvm调优案例

1. jvm调优思路

jvm调优其实更多的是对GC的优化,尤其是尽量减少full GC。

大多数情况下,对象在Eden区分配,当Eden区没有足够空间进行分配时,虚拟机将进行一次Minor GC ,可能有99%的对象被标记为垃圾被回收,剩余存活的对象会进入为空的survivor,下一次Eden区满了之后,又会触发minor gc,把Eden区和survivor区垃圾对象回收,把剩余存活的对象一次性挪动到另外一块为空的to区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,让eden区尽量的大,survivor区够用即可。

  • Minor GC/Young GC:指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快。
  • Major GC/Full GC:一般会回收老年代 ,年轻代,方法区的垃圾,Major GC的速度一般会比Minor GC的慢 10倍以上。
  • Eden与Survivor区默认8:1:1

明白了上边的对象流转过程,我们可以在这个过程中做一些手脚,来进行jvm调优!

1.1 jvm调优方案

  • ①:设置大对象直接进入老年代! 大对象就是需要大量内存空间的对象(比如数组、字符串) ,通过jvm参数-XX:PretenureSizeThreshold 可以设置大对象的大小,如果对象超过设置大小会直接进入老年代,不会进入年轻代,这个参数只在 Serial 和ParNew两个收集器下有效。

    • 具体操作:-XX:PretenureSizeThreshold=1000000 (单位是字节) -XX:+UseSerialGC
    • 使用场景:当我们可以确定系统中的对象大部分为大对象,且短期内不会被垃圾回收,就可以根据对象大小设置jvm参数,让这些大对象直接进入老年代,省去了对象在新生代流转的过程,节省了Eden区的空间,因为大对象最终总会进入老年代的,还不如提前让出Eden空间,让他处理更多的小对象,提升系统性能!
  • ②:设置长期存活的对象提前进入老年代! 新生代的对象每熬过一次Minor GC ,其年龄就会+1,默认15岁,也就是流转15次就会进入老年代。当我们的系统中大概有大部分(80%)的对象都会经过15次Minor GC 进入老年代,我们可以通过设置-XX:MaxTenuringThreshold来调整进入老年代需要的年龄阈值。比如设置年龄为8即可进入老年代,这样那些长期存活的对象,就可以尽早的进入老年代,减少对象在新生代的流转次数,提升了系统性能!
  • ③:根据survivor区的动态年龄判断机制,合理设置新生代大小 。一般超过survivor区大小的60%会发生动态年龄判断机制,此时把最老的对象放进老年代。可以适当增加survivor区的大小避免Full GC!动态年龄判断的机制作用其实是希望那些可能是长期存活的对象,尽早进入老年代,避免多次复制操作而降低效率。

2. 订单的秒杀模块jvm调优案例

架构如下:

对亿级电商平台的调优中,首先要对自己的系统有足够的了解。根据以上架构:

  • ①:如果平台日活用户为500w,那大部分的付费转化率为10%,也就是每日50w单左右。
  • ②:如果50w单是在平时非促销的时候,下订单操作通过负载均衡打到服务器上,也就每秒几单、十几单的样子,服务器可以抗住。但如果要搞促销,50w单要在几分钟内产生,那么每秒钟就高达1000多单的交易,如果不合理设置jvm参数,就可能会频繁发生Full GC!
  • ③:假设有订单三台服务器,每秒1000单通过负载均衡到三台服务器,每台服务器每秒处理300单左右!每个订单对象的大小是由order类中的字段来决定的,假设每个订单对象有几十个字段,撑死1kb,每秒300kb对象生成,订单接口中肯定不止一个订单对象,还有库存、优惠券、积分等对象,所以300kb放大20倍,也就是6MB,同时还可能有别的操作,比如订单查询等,再放大10倍,也就是60MB,因为要保证请求速度,所以这60MB对象1s后都会成为垃圾。
  • ④:此时每秒60M对象进入堆内存。假如服务器内存是8G,给操作系统分配4-5G,剩下的分给JVM,因为 新生代:老年代 = 1:2,则新生代拿到1G,老年代2G,元空间512Mb,栈1M,jvm参数设置 如图所示!对象会首先进入Eden,800/60 ≈ 14秒 ,也即14秒时Eden区被放满,发生Minor GC!

  • ⑤:Minor GC会进行stw,前13秒的对象直接被gc掉。然而由于gc时的stw,用户线程无法执行,此时可能第14秒创建的对象会没有使用完,就会一直被引用着,GC完毕后,第14秒创建的对象由于被引用而存活了下来,此时存活的对象会进入survivor区。由于survivor区存在动态年龄判断机制:如果Survivor区中的这批对象总大小大于Survivor区域内存大小的50%,那么>=这批年龄最大值的对象,都会被放入老年代。 该组对象大小>50MB,年龄都是1,所以此时第14秒这批对象都会直接进入老年代。也就是每14秒60M对象进入老年代!导致几分钟一次GC!
  • ⑥:由于上述原因就是由survivor区存在动态年龄判断机制导致的,所以我们可以通过调整新生代大小来避免,对象进入老年代!

    把年轻代分配2G,则survivor区为200M,60M的对象进来不至于触发动态年龄判断机制,一次Minor GC就杀死了所有对象,几乎没有对象进入老年代,解决了Fulle GC频繁的问题!

结论:通过上面这些内容介绍,大家应该对JVM优化有些概念了。

  • 尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收。
  • 同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收。

JVM调优思路、订单秒杀jvm调优案例相关推荐

  1. JVM调优三板斧,快速掌握调优的核心与思路

    如何从调优小白走向调优高手 说起JVM调优,大伙儿可能瞬间头皮发麻."好家伙,和调优沾边儿的事儿,不是我这个段位的小新手能解决的". 于是赶紧找来了技术大拿,看大拿三下五除二排查出 ...

  2. jvm调优思路及调优案例

    我们说jvm调优,其实就是不断测试调整jvm的运行参数,尽可能让对象都在新生代**(Eden)**里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小, ...

  3. JVM性能调优(4)——性能调优工具

    目录 一.JDK工具1.JDK工具2.利用 jps 找出进程3.利用 jstat 查看VM统计信息4.利用 jmap 查看对象分布情况5.利用 jstack 分析线程栈 二.Linux 命令行工具1. ...

  4. 【JVM 学习笔记 05】:JVM性能调优工具的使用和优化案例

    [JVM 学习笔记 05]:JVM性能调优工具的使用 1. 使用 jstat(命令行工具) 查看线上系统的JVM运行状况 1.1 常用命令 1.2 使用技巧 1.2.1 随着系统运行,每秒钟会在年轻代 ...

  5. JVM实用参数(四)内存调优

    理想的情况下,一个Java程序使用JVM的默认设置也可以运行得很好,所以一般来说,没有必要设置任何JVM参数.然而,由于一些性能问题(很不幸的是,这些问题经常出现),一些相关的JVM参数知识会是我们工 ...

  6. JVM调优笔记:认识JVM内存模型(jdk1.8)

    文章目录 1.什么是JVM 2.jdk.jre.jvm关系 3.JVM执行过程 4.JVM执行程序的过程 5.JVM运行时数据区 虚拟机栈(线程私有) 本地方法栈(线程私有) 程序计数器(线程私有) ...

  7. JVM 调优 1:“精通 JVM 调优,有过 JVM 调优经验”简历敢写吗?薪资涨 5k 的技巧

    文章目录 前言 一.部分大厂对于 JVM GC 的面试题 1.1.百度 1.2.顺丰 1.3.京东 1.4.淘宝 1.5.阿里.蘑菇街 二.Garbage Collectors(GC)作何使用 三.G ...

  8. Java生产环境下性能监控与调优详解 第8章 JVM字节码与Java代码层调优

    第8章 JVM字节码与Java代码层调优 8-1 jvm字节码指令-1 8-2 jvm字节码指令-2 8-3 i++与++i 8-4 字符串+拼接 8-5 Try-Finally字节码 8-6 Str ...

  9. jvm maxgcpausemillis 默认值_Tomcat和JVM的性能调优总结

    Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...

最新文章

  1. 实战tcpdump看RST
  2. 请求和响应向更多内容
  3. Android官方开发文档Training系列课程中文版:高效显示位图之管理位图内存
  4. 36 SD配置-销售凭证设置-定义项目类别
  5. Google最热开源项目
  6. 7 centos 时钟跟物理机同步_同步FIFO和异步FIFO
  7. 解决 GitHub 拉取代码网速慢的问题
  8. Chrome插件开发(chrome-extension)
  9. comsol3.5 软件下载
  10. java拍照控件焦距问题,监控摄像头镜头焦距计算方法
  11. 成熟的项目架构设计是什么样的?
  12. 怎样有效的将电脑中WPS文件转换成Excel格式
  13. python统计中英文字符_如何统计文本中的中英文字符数?Python帮你解决
  14. 电容笔和触控笔有什么区别?第三方电容笔了解下
  15. 论一个X倒下了千千万万个X站起来了
  16. 增加购物车商品数量【项目 商城】
  17. 计算机系统采用终中断的目的是?
  18. 客服常用话术大全,赶紧收藏起来吧!
  19. 我的知识和我的动力,来自哪里?
  20. BUU Crypto[1-8]

热门文章

  1. python在windows上安装_在Windows上安装Python | 严佳冬
  2. SQLAlchemy文档翻译
  3. SQL的汇总统计SELECT语句
  4. 公司的Java框架应具备的通用功能
  5. 浏览器了解(三)CSS解析
  6. WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信
  7. 法证先锋3中的Apps软件
  8. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:使用函数...
  9. REDO LOG大小引起的Oracle数据库性能下降
  10. 企业如何考虑自己的网络防护设备