高楼的性能工程实战课
高楼
盾山科技 CEO,7DGroup 创始人
19172 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 35 讲
特别放送 (1讲)
结课测试 (1讲)
结束语 (1讲)
高楼的性能工程实战课
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • WBF
    1、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-16
    9
  • jy
    请问,容器里面如何执行mysqlreport 呢? 生成的数据如何拿出来?谢谢老师

    作者回复: 一样的。可以在容器内安装,也可以远程执行哇。

    2021-10-14
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部