22 | 支付订单信息:如何高效解决for循环产生的内存溢出?
高楼
你好,我是高楼。
今天,我们来优化支付订单接口。通过这个接口,我们来看看怎么高效解决 for 循环产生的内存溢出问题。
对于 JVM 内存溢出或泄露来说,通常性能人员都能定位到一个应用 hang 住了。但是,要想进一步判断出应用 hang 住的原因,并没有那么容易做到。因为内存大时做堆 Dump 比较费时,更重要的一点是,要想把堆里面的对象和栈关联起来是需要足够的经验和时间的。这也是其中的难点之一。
这节课我就带你来看看怎么解决这个难点。
不过,在此之前,我们会先处理一个熟悉的问题,就是数据库表加索引。很显然,我们在测试这个接口时又遇到它了。虽然我在第 16 讲中给你重点讲过这个问题,但是这一次的每秒全表扫描比之前要高得多。通过这次的讲解,我希望你能明白只要存在全表扫描,CPU 消耗很快就会达到 100%。同时,也希望你能借此看清楚全表扫描对 CPU 消耗的影响。
场景运行数据
首先,我们来运行一下场景:
这是一个典型的 TPS 太低、响应时间不断上升的性能瓶颈,对于这种瓶颈的分析逻辑,我在前面的课程里已经写过很多次了,相信你已经掌握。下面我们来看一下具体的问题是什么。
架构图
这个接口的链路比较简单:User - Gateway - Order - MySQL,我们大概记在脑子里就好。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文通过一个支付订单接口的优化案例,详细介绍了如何高效解决for循环产生的内存溢出问题。作者首先介绍了JVM内存溢出或泄露的定位难点,然后分为两个阶段进行处理。第一阶段是处理数据库表加索引的问题,通过全局监控和定向监控分析,找到了全表扫描导致的CPU消耗过高,最终通过添加索引成功优化了性能。第二阶段则是处理内存泄漏问题,通过全局监控和GC健康状态的分析,发现了内存泄漏的情况,并提出了解决方案。整篇文章通过实际案例详细展示了性能问题的定位和解决过程,对于需要解决类似问题的技术人员具有很高的参考价值。文章内容涉及了定向监控分析、堆Dump生成和分析、线程CPU消耗分析等技术手段,为读者提供了解决类似问题的思路和方法。文章最后提出了两道思考题,引导读者深入思考并与作者交流讨论。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高楼的性能工程实战课》,新⼈⾸单¥59
《高楼的性能工程实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- WBF1、mysql: ①查看慢日志 ②top -Hp pid 定位线程号,通过线程号定位sql 然后查看执行计划分析是否存在全表扫描,表大小,制定优化方案 oracel: ②分析awr报告 2、 《1》定位堆栈 1、命令 (1)保存堆dump文件,打开dump文件,根据16进制线程号,查找代码的行号定位堆栈: a. jmap -histo:live 进程pid | more / jmap -histo pid|more) 通过进程号(jps -l)看线程调用堆栈 jmap -dump:format=b,file=文件名 进程pid; (b二进制格式) b. jstack 进程pid >>thread.dump ; c. jcmd 进程pid GC.heap_dump /filepath.hprof(二进制格式dump) d. ①配置java参数:(java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<file-or-dir-path>)自动抓取堆dump文件:java_pid.hprof ②使用Jconsole工具将操作调用的serVMOption参数:HeapDumpOnOutOfMemoryError 值设置为true (2)不保存dump文件,定位堆栈: a. 通过 perf record 命令录制进程一段时间,通过 perf report 分析堆栈 b. jstack 进程pid | grep 线程pid :top,top -Hp 进程pid,printf "%x\n" 线程pid,jstack 进程pid | grep 16进制线程pid 2、图形化工具: ①jvm右键java进程选择线程dump生成快照或打开dump文件 ②使用IBM Thread and Monitor Dump Analyzer for Java分析dump文件 ③jconsole ④使用MAT打开dump.hprof文件,查看可疑的内存消耗点的详情,查看对象以及它的依赖 dominator_tree 《2》分析源码: 查看代码行,分析所有调用该方法的代码逻辑,分析代码对应的SQL 《3》沟通:与开发沟通,是否存在定时任务,执行定时任务的数据量大小,有无加limit,线程数
作者回复: 整理的不错哦。表扬! 温馨提醒一下,mysql中是没有AWR报告的,oracle里才有。
2021-05-169 - jy请问,容器里面如何执行mysqlreport 呢? 生成的数据如何拿出来?谢谢老师
作者回复: 一样的。可以在容器内安装,也可以远程执行哇。
2021-10-14
收起评论