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 的性能有一个很大的提升。怎么选择垃圾收集器?
- 优先调整堆的大小让 JVM 自适应完成。
- 如果内存小于100M,使用串行收集器
- 如果是单核、单机程序,并且没有停顿时间的要求,串行收集器
- 如果是多 CPU、需要高吞吐量、允许停顿时间超过1秒,选择并行或者 JVM 自己选择
- 如果是多 CPU、追求低停顿时间,需快速响应(比如延迟不能超过1秒,如互联网应用),使用并发收集器
- 官方推荐 G1,性能高。现在互联网的项目,基本都是使用 G1。
最后需要明确一个观点:
没有最好的收集器,更没有万能的收集
调优永远是针对特定场景、特定需求,不存在一劳永逸的收集器
什么是调优?
- 根据需求进行JVM规划和预调优
- 优化运行JVM运行环境(慢,卡顿)
- 解决JVM运行过程中出现的各种问题(OOM)
1. JVM规划和预调优
调优,从业务场景开始,没有业务场景的调优都是耍流氓
无监控(压力测试,能看到结果),不调优
步骤:
- 熟悉业务场景(没有最好的垃圾回收器,只有最合适的垃圾回收器)
响应时间、停顿时间 [CMS G1 ZGC] (需要给用户作响应)
吞吐量 = 用户时间 /( 用户时间 + GC时间) [PS] - 选择回收器组合
- 计算内存需求(经验值 1.5G 16G)
- 选定CPU(越高越好)
- 设定年代大小、升级年龄
- 设定日志参数
-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%那么一定有线程在占用系统资源
- 找出哪个进程cpu高(top)
- 该进程中的哪个线程cpu高(top -Hp)
- 导出该线程的堆栈 (jstack)
- 查找哪个方法(栈帧)消耗时间 (jstack)
- 工作线程占比高 | 垃圾回收线程占比高
案例 3 :
系统内存飙高,如何查找问题?(面试高频)
- 导出堆内存 (jmap)
- 分析 (jhat jvisualvm mat jprofiler … )
如何监控JVM
- jstat jvisualvm jprofiler arthas top…
以上是关于JVM调优--02---JVM规划和预调优案例的主要内容,如果未能解决你的问题,请参考以下文章