内存泄漏排查记录

前提

进来项目现场又反馈某低代码项目存在越用越卡的问题,遂摸鱼排查一波,顺便复习 Memory使用方法。

Memory界面分析

memory是浏览器自带的内存排查工具,用来展示浏览器当前的内存快照。

存在三种使用快照获取方式:

1. Heap snapshot

获取当前js堆栈的瞬时内存快照。

  • Distance表示当前对象离js垃圾回收根对象的引用层级,挂载在window下的对象distance是1。
  • Shallow Size表示当前对象的自身大小(不包含内部引用的其它对象所占的内存)
  • Retained Size表示当前对象的总体大小(包括有引用关系的其他对象)

可以使用Comparison比较最近两个快照的内存差异

从图中的Delta中,可以清楚看到内存变化。

2. Allocation instrumentation on timeline

展示内存随着时间的变化轴线。

类似于火焰图,可以详细分析某个时间段内存变化

3. Allocation sampling

展示某个时间段内的内存变化。也就是方法二截取某个时间段的效果。该方法虽然没有方法2功能强,但是开销小,可以测试更长的时间区间。

只显示发生变化的内存快照,非常好用

如何定位内存泄漏

通过上面的快照,很快就能确定是否发生内存泄漏。之后该如何定位相关代码并解决问题呢?

1. 通过代码跳转链接

快照中存在产生该内存的相关代码链接,可以点击直接查看。

如果对项目代码熟悉的话,可以直接发现内存泄漏的相关代码。

2. 通过store as global variable功能

项目中代码往往比较复杂,并且经过编码压缩。通过代码链接点进去可能直接可能完全看不明白。这时候可以用下面的方法直接查看当前对象: store as global variable可以将当前对象存在window上并且直接输出:

这时候便可以查看对象,并且快速找到泄漏的部分:

例如该泄漏问题就是bus总线事件未及时处理导致的, 后续结合项目实际情况进行处理即可

相关推荐
IT_陈寒7 小时前
React组件莫名重渲染?你可能忘了这个小细节
前端·人工智能·后端
鶴哥只手遮天7 小时前
React 19.3.1 源码深度剖析-第 12 章(下)RSC 与 Flight 协议
前端·react.js·开源
deli0077 小时前
TCP 三次握手到底发几个包?丢包重传动画实测一遍
前端
盟接之桥7 小时前
盟接之桥谈线束数字化-按单入按单出:线束企业库存管理的破局之道
大数据·前端·网络·数据库·人工智能·制造
巴勒个啦7 小时前
Prompt Engineering 实战:5 个让 AI 生成生产级业务代码的工程模式
java·前端
去伪存真7 小时前
AI时代,古法编程的码农路在何方?
前端
我不会起名字3227 小时前
MySQL 深分页 LIMIT 1000000 卡死:3 种改写与 4 组实测对比
mysql·性能优化·索引·分页·limit
计算机魔术师7 小时前
从7月绕过沙盒到9月再曝违规,OpenAI的AI安全防线在漏什么
前端
我的div丢了肿么办8 小时前
element-plus表格使用:filter-method过滤导致出现无数据
前端·javascript·vue.js
F_Quant8 小时前
高股息+破净+PEG三因子:年化20%的背后,是一个“敢于证伪自己”的捡烟蒂策略
前端