怎么用JS理解IE的内存泄露
这篇文章主要讲解了“怎么用JS理解IE的内存泄露”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用JS理解IE的内存泄露”吧!
创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站制作、成都外贸网站建设、北湖网络推广、成都微信小程序、北湖网络营销、北湖企业策划、北湖品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供北湖建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
一、前言
IE6~8除了不遵守W3C标准和各种诡异外,我想最让人诟病的应该是内存泄露的问题了。这阵子趁项目技术调研的机会好好的再认识一回,以下内容若有纰漏请大家指正,谢谢!
目录一大坨!
二、内存泄漏到底是哪里漏了?
2.1. JS Engine Object、DOM Element 和 BOM Element
2.2. JS Engine Object的内存回收机制
2.3. DOM Element的内存回收机制
2.4. 两种泄漏方式
三、4种泄漏模式
3.1. Circular References
3.2. Closures
3.3. Cross-page Leaks
3.4. Pseduo-Leaks
四、当前页面泄漏的示例
4.1. DOM Hyperspace引起的DOM Element引用孤岛
4.2. 释放Iframe没那么简单
五、IE8下连续修改IMG的src居然耗尽内存?
六、监控工具
七、总结
八、参考
二、内存泄漏到底是哪里漏了?
SPA跑久了页面响应速度剧减又被用户投诉,搪塞说句“IE是比较容易发生内存泄漏,刷刷页面就好”。那真的是刷刷页面就能释放泄漏了的内存吗?下面我们一起来探讨一下!
内存泄漏:内存资源得不到释放 && 失去对该内存区的指针 => 无法复用内存资源,最终导致内存溢出
2.1. JS Engine Object、DOM Element 和 BOM Element
Script中我们能操作的对象可分为三种:JS Engine Object、DOM Element 和 BOM Element。
JS Engine Object: var obj = Object(); var array = [];等等
DOM Element: var el = document.createElement('div'); var div = document.getElementById('name');等等
BOM Element: window; window.location;等等
其中只有JS Engine Object和DOM Element是我们可以CRUD的,因此也就有可能发生内存泄漏的问题。
2.2. JS Engine Object的内存回收机制
IE的JScript Garbage Collector采用的是Mark-and-Sweep算法,当执行垃圾回收时会先遍历所有JS Engine Object并标记未被引用的对象,然后释放掉被标记的内存空间。
由于Mark-and-Sweep算法的缘故,也能很好地释放引用孤岛的内存空间。
而IE下独有的CollectGarbage()则用于回收无引用或引用孤岛的JS Engine Object。
2.3. DOM Element的内存回收机制
当DOM Element不再被引用时会被回收,但具体被谁何时回收则有待研究了。
2.4. 两种泄漏方式
a. 当前页面泄漏:刷新页面或跳转到其他页面就能释放的内存资源。
b. 跨页面泄漏:刷新页面或跳转到其他页面也无法释放的内存资源。
当前页面泄漏处理难度相对简单,跨页面泄漏才是处理大头。
三、4种泄漏模式
下面是Justin Rogers总结出来的4种会引起泄漏的反模式。
3.1. Circular References(导致跨页面内存泄漏)
循环引用可谓是引起内存泄漏的根本原因,其他的泄漏模式***层还是因为出现的循环引用。
Leak Memory