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对象内存明显上升bash






又经过Delta发现,array数组下的对象的个数在递增,经过对象的key值,能够定位到具体代码,进而定位到因为闭包引发对外层变量的引用,内存未释放闭包




另外若是是浏览器里能够经过Performance也能够查看内存堆随时间的变化函数


相关文章
相关标签/搜索