多iframe应用引起的内存问题
1. 内存泄漏
1.1 什么是内存泄漏?
程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。
对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。
不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)。
这很麻烦,所以大多数语言提供自动内存管理,减轻程序员的负担,这被称为"垃圾回收机制"(garbage collector)。
1.2 垃圾回收机制
垃圾回收机制怎么知道,哪些内存不再需要呢?
并不是说有了垃圾回收机制,程序员就轻松了。你还是需要关注内存占用:那些很占空间的值,一旦不再用到,你必须检查是否还存在对它们的引用。如果是的话,就必须手动解除引用。
1.3 内存泄漏的识别方法
怎样可以观察到内存泄漏呢?
如果连续五次垃圾回收之后,内存占用一次比一次大,就有内存泄漏。这就要求实时查看内存占用。
Chrome 浏览器查看内存占用,按照以下步骤操作。

- 打开开发者工具,选择 Timeline 面板
- 在顶部的
Capture字段里面勾选 Memory- 点击左上角的录制按钮。
- 在页面上进行各种操作,模拟用户的使用情况。
- 一段时间后,点击对话框的 stop 按钮,面板上就会显示这段时间的内存占用情况。
如果内存占用基本平稳,接近水平,就说明不存在内存泄漏。反之,就是内存泄漏了。
1.4 WeakMap
前面说过,及时清除引用非常重要。但是,你不可能记得那么多,有时候一疏忽就忘了,所以才有那么多内存泄漏。
最好能有一种方法,在新建引用的时候就声明,哪些引用必须手动清除,哪些引用可以忽略不计,当其他引用消失以后,垃圾回收机制就可以释放内存。这样就能大大减轻程序员的负担,你只要清除主要引用就可以了。
ES6 考虑到了这一点,推出了两种新的数据结构:WeakSet 和 WeakMap。它们对于值的引用都是不计入垃圾回收机制的,所以名字里面才会有一个"Weak",表示这是弱引用。
下面以 WeakMap 为例,看看它是怎么解决内存泄漏的。
const wm = new WeakMap();
const element = document.getElementById('example');
wm.set(element, 'some information');
wm.get(element) // "some information"
上面代码中,先新建一个 Weakmap 实例。然后,将一个 DOM 节点作为键名存入该实例,并将一些附加信息作为键值,一起存放在 WeakMap 里面。这时,WeakMap 里面对element的引用就是弱引用,不会被计入垃圾回收机制。
也就是说,DOM 节点对象的引用计数是1,而不是2。这时,一旦消除对该节点的引用,它占用的内存就会被垃圾回收机制释放。Weakmap 保存的这个键值对,也会自动消失。
基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。
2. 多iframe引起的内存问题
多iframe引起的内存问题主要表现在IE浏览器上,存在的问题
会存在iframe窗口关闭了但是IFrame对象内存不释放。
el.src可能还没有执行完,就执行后面的语句,建议设置成‘about: blank’
如果IFrame中包含的是跨域内容,则会提示没有权限;
窗体关闭的比脚本执行的快,内存仍然没有释放;
最终的处理方式
function removeFrame() {
let el = document.getElementById("frame");
// 取消窗口监听事件
if (el) {
el.src = "about:blank";
if (el.contentWindow) {
try {
el.contentWindow.document.write('');
el.contentWindow.document.clear();
el.contentWindow.close()
} catch(e){
// todo
}
}
const p = el.parentNode;
if(p){
p.removeChild(el);
}
try {
window.CollectGarbage()
} catch (e) {
// todo
}
el = null
}
}
多iframe应用引起的内存问题的更多相关文章
- 解决IE浏览器IFrame对象内存不释放问题
最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放.弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时I ...
- iframe动态创建及释放内存
近期參与一个项目的开发,因为项目是基于浏览器的胖client(RIA)应用程序,页面中大量调用iframe.后期測试发现浏览器内存一直居高不下,并且打开iframe页面越多内存占用越大.在IE系列浏览 ...
- jquery load 和 iframe 比较
如果要加载的东西比较简单,里面的没有复杂的数据和逻辑,可以使用load.如果要加载的页面自身有复杂的逻辑.操作,还是建议使用ifame,因为iframe里面可以引入自身的js和样式,而load引入的东 ...
- 新手入门:史上最全Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- 基于web的IM软件通信原理分析
关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...
- web端及时通讯原理
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- window.print()局部打印三种方式
首先准备要打印的内容,也可以打印时再填充,html中定义如下: <!--startprint--> <div id="printcontent" style=&q ...
- 新手入门贴:史上最全Web端即时通讯技术原理详解
关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...
随机推荐
- MySQL的多表查询学习笔记
一.案例准备 create table dept( id int primary key auto_increment, name ) ); insert into dept values(null, ...
- 【网摘】检测 iframe 是否加载完成
var iframeSet = document.getElementById("iframeSet"); //需要检测的 iframe if(iframeSet.attachEv ...
- Xcode创建子工程以及工程依赖
https://www.jianshu.com/p/f2bc7d155a86 阅读 7858 视频地址 如果文章不详细,点击看操作视频 项目需求:代码抽层,业务逻辑和数据处理要高度抽离,模块化,需要将 ...
- 用for循环写这段代码
之前用while循环写了一段代码,现在改为用for循环来写,代码如下: hongtao_age = 38 for i in range(5): guess_age = int(input(" ...
- ModBus的小于3.5S间隔的理解
modbus协议中规定:至少3.5个字符传输时间的停顿间隔时间标志了消息的结束. 我的理解如下:约定参数:9600bps,8数据位,无奇偶校验,1起始位,1停止位. 9600bps代表在9600的波特 ...
- C语言-排序和查找
一 冒泡排序:算法特点:两层循环外层控制排序的趟数,内存控制相邻元素两两比较的次数.n个数共需n-1趟,(i=1;i<n;i++)趟数=n-1-1+1,其中第j趟需要相邻元素两两比较的次数为n- ...
- 关于PGSQL连接问题
今天把运维管理服务移植在Linux下测试,但又不想在Linux中安装PGSQL的服务器,就想让运维管理服务在虚拟机中连接windows的PG服务,却发现PG服务器一直拒绝连接,检查了网络端口之后都没问 ...
- php 基础 获取远程连接
1 file_get_contents get $opts = array( 'http'=>array( 'method'=>"GET", 'timeout'=> ...
- Python - 编程技巧,语法糖,黑魔法,pythonic
参考,搬运 http://python-web-guide.readthedocs.io/zh/latest/idiom/idiom.html 待定 1. Python支持链式比较 # bad a = ...
- Servlet详细介绍
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...