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

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM调优--02---JVM规划和预调优案例相关的知识,希望对你有一定的参考价值。


调优前的基础概念:

吞吐量:用户代码时间 /(用户代码执行时间 + 垃圾回收时间)

响应时间: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…

以上是关于JVM调优--02---JVM规划和预调优案例的主要内容,如果未能解决你的问题,请参考以下文章

大型企业JVM性能调优实战Java垃圾收集器及gcroot

JVM调优参数方法工具以及案例总结

JVM调优--06---调优案例汇总

5JVM--调优案例分析

JVM堆区域的一个详细了解并附带调优案例

JVM堆区域的一个详细了解并附带调优案例