JVM调优--02---JVM规划、预调优、案例

本文介绍了JVM调优的基础概念,如吞吐量和响应时间,并强调了明确需求的重要性。通过不同的场景案例,展示了如何根据业务需求选择垃圾收集器,如Serial、Parallel、CMS、G1和ZGC。同时,提出了优化JVM运行环境的方法,包括处理CPU高负载和内存飙高的问题。文章还提醒读者,没有最好的收集器,调优应针对特定场景和需求。
摘要由CSDN通过智能技术生成


调优前的基础概念:

吞吐量:用户代码时间 /(用户代码执行时间 + 垃圾回收时间)
响应时间:STW越短,响应时间越好

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

明确需求:

  • 所谓调优,首先确定,追求啥?吞吐量优先,还是响应时间优先?还是在满足一定的响应时间的情况下,要求达到多大的吞吐量…

场景:

  • 科学计算,吞吐量。数据挖掘,thrput。吞吐量优先的一般:(PS + PO)
  • 响应时间:网站 GUI API (1.8 G1)

垃圾回收器总结

截止 JDK 1.8,一共有7款不同的垃圾收集器。每一款的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器。

在这里插入图片描述

GC 发展阶段:Serial => Parallel(并行)=> CMS(并发)=> G1 => ZGC

不同厂商、不同版本的虚拟机实现差距比较大。HotSpot 虚拟机在 JDK7/8 后所有收集器及组合如下图

在这里插入图片描述
在这里插入图片描述

怎么选择垃圾回收器

Java 垃圾收集器的配置对于 JVM 优化来说是一个很重要的选择,选择合适的垃圾收集器可以让 JVM 的性能有一个很大的提升。怎么选择垃圾收集器?

  1. 优先调整堆的大小让 JVM 自适应完成。
  2. 如果内存小于100M,使用串行收集器
  3. 如果是单核、单机程序,并且没有停顿时间的要求,串行收集器
  4. 如果是多 CPU、需要高吞吐量、允许停顿时间超过1秒,选择并行或者 JVM 自己选择
  5. 如果是多 CPU、追求低停顿时间,需快速响应(比如延迟不能超过1秒,如互联网应用),使用并发收集器
  6. 官方推荐 G1,性能高。现在互联网的项目,基本都是使用 G1
最后需要明确一个观点:

没有最好的收集器,更没有万能的收集
调优永远是针对特定场景、特定需求,不存在一劳永逸的收集器

什么是调优?

  1. 根据需求进行JVM规划和预调优
  2. 优化运行JVM运行环境(慢,卡顿)
  3. 解决JVM运行过程中出现的各种问题(OOM)

1. JVM规划和预调优

调优,从业务场景开始,没有业务场景的调优都是耍流氓
监控(压力测试,能看到结果),不调优

步骤:

  1. 熟悉业务场景(没有最好的垃圾回收器,只有最合适的垃圾回收器)
    响应时间、停顿时间 [CMS G1 ZGC] (需要给用户作响应)
    吞吐量 = 用户时间 /( 用户时间 + GC时间) [PS]
  2. 选择回收器组合
  3. 计算内存需求(经验值 1.5G 16G)
  4. 选定CPU(越高越好)
  5. 设定年代大小、升级年龄
  6. 设定日志参数
   -Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log 
   -XX:+UseGCLogFileRotation 
   -XX:NumberOfGCLogFiles=5 
   -XX:GCLogFileSize=20M 
   -XX:+PrintGCDetails 
   -XX:+PrintGCDateStamps
   -XX:+PrintGCCause

. 或者每天产生一个日志文件
7. 观察日志情况

调优案例

文章 :

简述–高并发解决方案–01
计算机软件架构发展历史

案例1:垂直电商

垂直电商,最高每日百万订单,处理订单系统需要什么样的服务器配置?
  • 这个问题比较业余,因为很多不同的服务器配置都能支撑(1.5G 16G)
  • 1小时360000集中时间段, 100个订单/秒,(找一小时内的高峰期,1000订单/秒)

经验值,

  • 非要计算:一个订单产生需要多少内存?512K * 1000 500M内存
  • 专业一点儿问法:要求响应时间100ms
最后还是得实际压测

案例2:12306遭遇春节大规模抢票应该如何支撑?

12306应该是中国并发量最大的秒杀网站:
号称并发量100W最高

CDN -> LVS -> NGINX -> 业务系统 -> 每台机器1W并发(10K问题) 100台机器

在这里插入图片描述

普通电商订单 -> 下单 ->订单系统(IO)减库存 ->等待用户付款
  • 12306的一种可能的模型: 下单 -> 减库存 和 订单(redis kafka) 同时异步进行 ->等付款
  • 减库存最后还会把压力压到一台服务器
  • 可以做分布式本地库存 + 单独服务器做库存均衡
大流量的处理方法:分而治之

2. 优化JVM运行环境(慢,卡顿)

案例 1 :

有一个50万PV的资料类网站(从磁盘提取文档到内存)原服务器32位,1.5G的堆,用户反馈网站比较缓慢,因此公司决定升级,新的服务器为64位,16G的堆内存,结果用户反馈卡顿十分严重,反而比以前效率更低了

1. 为什么原网站慢?

  • 很多用户浏览数据,很多数据load到内存,内存不足,频繁GC,STW长,响应时间变慢

2. 为什么会更卡顿?

  • 内存越大,FGC时间越长

3. 怎么优化?

  • PS --> PN + CMS 或者 G1

案例 2 :

系统CPU经常100%,如何调优?(面试高频)

CPU100%那么一定有线程在占用系统资源

  1. 找出哪个进程cpu高(top)
  2. 该进程中的哪个线程cpu高(top -Hp)
  3. 导出该线程的堆栈 (jstack)
  4. 查找哪个方法(栈帧)消耗时间 (jstack)
  5. 工作线程占比高 | 垃圾回收线程占比高

案例 3 :

系统内存飙高,如何查找问题?(面试高频)
  • 导出堆内存 (jmap)
  • 分析 (jhat jvisualvm mat jprofiler … )

如何监控JVM

  • jstat jvisualvm jprofiler arthas top…
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值