内存泄漏

参考 : https://www.jianshu.com/p/12d5209ef882

<style>
    #button{
        width: 100px;
        height: 100px;
        background: red;
        cursor: pointer;
    }
</style>
<body>
   <div id="button"></div>
</body>
<script>

var button = document.getElementById('button');
button.addEventListener('click', function () {
    var a = new Array(100000).fill(1);
    var b = new Array(20000).fill(1);
});
</script>
</html>

1.监听内存情况

不点击的情

 

 

 最后内存显示的线,都变低了,因为一个,垃圾回收机制会把这部分的变量给回收掉。

第二次点击按钮,然后蓝色的一条线就是js事件的占用内存情况,因为没用刷新页面,所以全局被垃圾回收掉的变量已经不占内存了

 

 

 浏览器的垃圾回收机制,是每隔3.5秒(差不多,肉眼测量)回收一次不用的内存

var arr = [];
var button3 = document.getElementById('button');
button3.addEventListener('click', function () {
    var a = new Array(100000);
    var b = new Array(20000);
    arr.push(b);
});

等浏览器第一次回收内存以后,疯狂点击按钮,之后,内存会变高,然后浏览器又回收了一次,内存降低了一点

 

 

,再疯狂点击几次,就看到内存又变高了,然后浏览器又回收了一次内存,之后就稳定在这个值上面。

值变得越来越高,没用被释放掉,即使垃圾回收了,内存任然被占用不被释放掉。

这样就是内存泄漏。

 但是

var b = "sssss";字符串就不会造成内存的泄漏,因为数组是引用,不能被释放。但是变量会被释放掉。

分析一下:

因为点击按钮,以后会生成一个数组,内存会给这个数组分配一个内存空间。执行完毕以后,分配给数组的内存应该被释放掉,但是这个数组被外部的arr数组保存了引用,
它就不会被释放掉了
就一直保存在内存里面,每次点击一次,就会再分配一个新的内存空间。

因为浏览器的内存是有限的,内存不够的时候,就会去释放内存,垃圾回收机制。内存不断被占掉,
然后新的程序变量运行内存不够就会去
不停的释放内存,就会让浏览器越来越卡,甚至崩溃。为啥页面逻辑越写越多,页面越来越卡,还会奔溃,就是内存管理有问题。
查看页面动态内存情况

 


 




可以看出内存泄漏的情况
反复执行同个函数,内存却梯状式增长,手动点击 GC 内存也没有下降,说明函数每次执行都有部分内存泄漏了(引用别人的原话)。



 

posted on 2020-09-23 11:17  chenyi4  阅读(129)  评论(0编辑  收藏  举报

导航