【JVM】JVM调优的一些概念、规划、案例分析

本文详细介绍了JVM调优的概念、重要指标如QPS、TPS和响应时间,并探讨了如何根据业务场景选择合适的垃圾回收器。通过设置JVM参数进行内存管理和日志监控,以解决性能问题和内存溢出。文中还列举了多个实际案例,包括电商订单系统、12306抢票服务以及内存消耗分析,展示了如何通过压测和监控来优化系统性能。
摘要由CSDN通过智能技术生成

JVM调优

调优的基本概念

QPS:每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

TPS:就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

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

    吞吐量越大,说明拿出时间干正经事的时间越多

  2. 响应时间:STW越短,响应时间越好

常见的命令行参数:

标准: - 开头,所有的HotSpot都支持

非标准:-X 开头,特定版本HotSpot支持特定命令

不稳定:-XX 开头,下个版本可能取消

  1. 区分概念:内存泄漏memory leak,内存溢出out of memory
  2. java -XX:+PrintCommandLineFlags HelloGC
  3. java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
    PrintGCDetails PrintGCTimeStamps PrintGCCauses
  4. java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags HelloGC
  5. java -XX:+PrintFlagsInitial 默认参数值
  6. java -XX:+PrintFlagsFinal 最终参数值
  7. java -XX:+PrintFlagsFinal | grep xxx 找到对应的参数
  8. java -XX:+PrintFlagsFinal -version |grep GC

什么是调优

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

调优,从规划开始

  • 调优,从业务场景开始,没有业务场景的调优都是耍流氓

  • 无监控(压力测试,能看到结果),不调优

  • 步骤:

    1. 熟悉业务场景(没有最好的垃圾回收器,只有最合适的垃圾回收器)

      1. 响应时间、停顿时间 [CMS G1 ZGC] (需要给用户作响应)
      2. 吞吐量 = 用户时间 /( 用户时间 + 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. 观察日志情况

-X  loggc:/opt/xxx/logs/xxx-xxx-gc-%t.log 			  日志文件,按系统时间产生
-XX:+UseGCLogFileRotation 				循环使用
-XX:NumberOfGCLogFiles=5            产生五个日志文件
-XX:GCLogFileSize=20M 			每个日志文件的大小为20M
-XX:+PrintGCDetails            日志文件的内容
-XX:+PrintGCDateStamps         打印GC发生的时间戳
-XX:+PrintGCCause            GC原因
五个日志文件,每个日志文件满了之后就删除最前面的日志文件
这样的话,日志文件就100M
-Xmx10m -Xms10m -XX:+PrintGCDetails
最大堆内存10m、初始化堆内存10m、开启了GC日志输出

GC日志文件中的具体内容分析图:

在这里插入图片描述

案例分析

(1)案例:垂直电商,最高每日百万订单,处理订单系统需要什么样的服务器配置?

这个问题比较业余,因为很多不同的服务器配置都能支撑(1.5G 16G)

1小时360000集中时间段, 100个订单/秒,(找一小时内的高峰期,1000订单/秒)

经验值,(拿数据过来进行压测)

非要计算:一个订单产生需要多少内存?512K * 1000 500M内存

专业一点儿问法:要求响应时间100ms

压测!

拿性价比较高的服务器来做压测,不行的话加CPU内存,再不行就上云

(2)案例:12306遭遇春节大规模抢票应该如何支撑?(单机10K问题)redis可解决

12306应该是中国并发量最大的秒杀网站:

号称并发量100W最高

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

普通电商订单 -> 下单 ->订单系统(IO)减库存 ->等待用户付款

12306的一种可能的模型: 下单 -> 减库存 和 订单(redis kafka) 同时异步进行 ->等付款

减库存最后还会把压力压到一台服务器

可以做分布式本地库存 + 单独服务器做库存均衡

大流量的处理方法:分而治之

(3)案例:怎么得到一个事务会消耗多少内存?

  1. 弄台机器,看能承受多少TPS?是不是达到目标?扩容或调优,让它达到
  2. 用压测来确定

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

  1. 为什么原网站慢?
    很多用户浏览数据,很多数据load到内存,内存不足,频繁GC,STW长,响应时间变慢
  2. 为什么会更卡顿?
    内存越大,FGC时间越长
  3. 咋办?
    PS -> PN + CMS 或者 G1

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

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

  1. 找出哪个进程cpu高(top)
  2. 该进程中的哪个线程cpu高(top -Hp)
  3. 导出该线程的堆栈 (jstack)
  4. 查找哪个方法(栈帧)消耗时间 (jstack)
  5. 工作线程占比高 | 垃圾回收线程占比高
  1. 系统内存飙高,如何查找问题?(面试高频)
    1. 导出堆内存 (jmap)
    2. 分析 (jhat jvisualvm mat jprofiler … )
  2. 如何监控JVM
    1. jstat jvisualvm jprofiler arthas top…
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值