前提
进来项目现场又反馈某低代码项目存在越用越卡的问题,遂摸鱼排查一波,顺便复习 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总线事件未及时处理导致的, 后续结合项目实际情况进行处理即可