1分钟快速排查内存泄漏

1分钟快速排查内存泄漏

内存泄漏的原因

是指程序中己动态分配的堆内存由于某种原因未释放或无法释放,那么为什么没有释放呢(1.根据JS的垃圾回收机制,当内存中引用的次数为0的时候内存才会被回收 , 2.从根部出发触及到的对象被标记为不再使用才会被释放)

内存泄漏的几种情况

  • 全局变量:全局变量引用、变量未申明
  • 闭包:内层函数的变量对外层函数内的变量存在引用,闭包未得到释放,可能会导致内存泄漏
  • 事件监听未移除:重复监听
  • 缓存:缓存未清除导致,所以设置个缓存最大值

如何避免?

  • Eslint检测非期望的全局变量
  • 尽量少写复杂闭包
  • 绑定时间在Destroy的时候记得清除

如何解决

heapdump打快照,memory看内存快照

泄漏前,泄漏中,通过Delta对比对象变化

闭包导致的案例


        function Foo(){            var stage = []            setInterval(() => {                debugger                this.data = {                    name: 'wbczxxxxxxxxxxxxxxxxxx',                    hobby: {                        phone: '11'                    },                }                stage.push(this.data)            });        }        const foo = new Foo()


如果你还不能确认是闭包导致的问题,通过调试工具右下角可以发现形成了闭包



打快照发现,Js Arrays对象内存明显上升






又通过Delta发现,array数组下的对象的个数在递增,通过对象的key值,可以定位到具体代码,进而定位到由于闭包引起对外层变量的引用,内存未释放




另外如果是浏览器里可以通过Performance也可以查看内存堆随时间的变化






最后插播一则小广告



免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部