博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于JavaScript内存泄漏的质疑
阅读量:5061 次
发布时间:2019-06-12

本文共 863 字,大约阅读时间需要 2 分钟。

     近几天看了些关于JavaScript内存管理的文章,相对于Java JVM的内存管理,显得简单些。

     在学习的过程中,发现有不少网友谈到了循环引用,说循环引用会造成内存泄漏,垃圾回收器无法回收。

     实际上,并没有这么可怕,根据小菜目前的了解,这种循环引用造成的内存泄漏,仅仅会发生在低版本的IE浏览器上,现代浏览器是不会这么蠢的。

     举个例子,网络上流行的说法大致有如下两种:

1  2  3    4     
5
6 循环引用内存分析 7 9 10 11 12 13 14 32 33

     一个简单的页面,上边两个按钮,分别调用两个会造成内存泄漏的方法。

     借助于Chrome浏览器的Profiles功能,生成内存快照,然后对比,发现这两种写法在谷歌浏览器下均没有泄漏问题。

     具体做法是:

 

  1. 打开页面不做任何操作,直接生成页面内存快照。
  2. 点击按钮,然后再次生成内存快照。
  3. 对比两次内存变化。

 

     不断重复这个过程,生成7、8个快照,趋于稳定,会发现往后内存根本没有变化。

 

 

 

 

     每次生成快照之前,都会强制执行GC(垃圾回收),说明我们每次构造的循环引用,马上被回收了,所以不会出现在快照中。

     接下来从理论角度说说为什么应该被回收。

     因为这些循环引用,说白了都是无效引用。可以简单理解为:只有从栈区发起的引用才是有效的。本例中的引用,是堆区对象的互相引用,虽然引用计数不为0,但是不可到达,在回收内存时直接就被消灭了。

     再深入了说,低版本IE浏览器采用的是引用计数机制回收内存,互相引用造成对方计数互不为0,导致无法回收。

     而现代浏览器,采用的是Cheney算法,大致就是把内存分为两份,不断的来回复制,这样那些不可到达的对象,就无法复制,自然被回收了。

     栈区、静态、常量之类的字眼,一般是代表root(根)区,只有从这些地方发出的引用,才是可到达的,有效的。

 

转载于:https://www.cnblogs.com/iyangyuan/p/4310601.html

你可能感兴趣的文章
AJAX
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
Leetcode(7)-反转整数
查看>>
堆栈的分配效率问题
查看>>
特征选取1-from sklearn.feature_selection import SelectKBest
查看>>
python机器学习-sklearn挖掘乳腺癌细胞(一)
查看>>
队列实现
查看>>
node04-buffer
查看>>
来看看css3中的box-shadow
查看>>
出错问题总结
查看>>
ECSHOP首页热门搜索关键词随机显示
查看>>
javascript 中typeOf
查看>>
javascript选择排序
查看>>
Centos7.3安装和配置Tomcat8
查看>>
Python基本语法初试
查看>>
不带走西天的云彩
查看>>
列表控件
查看>>
python_socket2
查看>>
jQuery 核心函数
查看>>