浏览器中的内存泄露
作者:winter 来源:winter 博客 发布时间:2008-05-03 16:53:00
首先说说什么是内存泄露,在一个进程中,如果某一块内存无法访问,且直到进程结束为止也无法释放,那么就发生了内存泄露。通常这种情况发生在C++之类的手动管理内存的语言编写的程序中,程序员忘记delete或者free会导致内存泄露。本文主要讨论的是浏览器中的内存泄露问题,也就是说,javascript程序导致的内存泄露。
目前为止最权威的关于浏览器内存泄露的文章应该是以下2篇 分别来自微软的Understanding and Solving Internet Explorer Leak Patterns(中文版)和来自IBM的Memory leak patterns in JavaScript(中文版)
但是这2篇对js语言的认识不够深入,所以讨论的内存泄露问题和解决方案都存在一些偏差。更重要的是,他们太老了,没有介绍IE7的内存泄露新模式。希望本文下面的部分能让读到此文的人更加清晰的认识内存泄露问题。
1.javascript对象的基础知识
(1)创建对象
js中创建对象的方式非常自由,通常有这样几种:直接量、new表达式、内置函数、函数调用。后面是几个例子:
直接量:{"a":10,"b":30}
new表达式:var o=new cls();
内置函数:var e=document.createElement("div");var a=new ActiveXObject("XML2.0.XMLHTTP");
函数调用:function f(){};f();
(2)特殊的对象——作用域对象
值得一提的是函数调用也会创建对象
function f(){
var a=10;
var b=20;
}
尽管按照语言标准无法以任何方式访问,但是f函数在每次执行时都会创建一个有属性a和b的对象,这被称为作用域对象。而js将维护一个被称为scope chain的链表,它是一条由当前可访问的所有作用域对象组成的链表。因为js的作用域规则是定义时的作用域,所以每个函数对象被创建时都会以一个属性[[scope]]保存它的外部作用域链。
特别地,在FireFox中,允许用__parent__访问[[scope]]属性所属的函数
关于js的更多,可以去查阅js标准文档ECMA262(HTML版),这里无法完整地介绍js的对象机制。
猜你喜欢
- 开发环境:python版本2.X#!/usr/bin/env python# -*- coding:utf-8 -*-# 适合python版
- Python里的正则表达式Python里的正则表达式,无需下载外部模块,只需要引入自带模块:re:import re官方re模块文档: ht
- Go反射的实现和 interface 和 unsafe.Pointer 密切相关。如果对golang的 interface 底层实现还没有理
- 一、前期准备CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT,
- 借鉴:python绘制lost(损失)曲线 加 方差范围直接上效果图: 上代码:import reimport seaborn a
- mark标记在实际工作中,我们要写的自动化用例会比较多,也不会都放在一个py文件中,如果有几十个py文件,上百个方法,而我们只想运行当中部分
- python取对数可以采用两种工具包,math包可对单一数字取对数,numpy可以数列整体取对数。1、仅对单一数字取对数import mat
- 前言NSQ是Go语言编写的,开源的分布式消息队列中间件,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。NSQ 具有分布式和去中心化
- 本文实例讲述了Python数据分析之双色球基于线性回归算法预测下期中奖结果。分享给大家供大家参考,具体如下:前面讲述了关于双色球的各种算法,
- dict.setdefault(key, default=None) --> 有key获取值,否则设置 key:default,并返回
- 前述VARCHAR和CHAR是两种最主要的字符串类型。不幸的是,很难精确地解释这些值是怎么存储在磁盘和内存中的,因为这跟存储引擎的具体实现有
- python爬虫学习之定向爬取淘宝商品价格,供大家参考,具体内容如下import requestsimport redef getHTMLT
- 一、要求 1 创建数据表 CREATE TABLE [dbo].[StuScore]( [stuid] [int] NOT NULL, [s
- /* --注意:准备数据(可略过,非常耗时) CREATE TABLE CHECK1_T1 ( ID INT, C1 CHAR(8000)
- 前言大家都知道,一般情况下,输入框的密码我们是看不到密码的,只有当我们点击查看密码的小图标时,密码才会显现出来,实现起来也非常简单,通过点击
- 问题jupyter notebook读入csv数据时出现错误“SyntaxError: (unicode error) ‘unicodees
- scikit-learn是python的第三方机器学习库,里面集成了大量机器学习的常用方法。例如:贝叶斯,svm,knn等。scikit-l
- 一、一元操作符1.delete操作符delete 操作符用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放语法:delet
- 抽象工厂模式(Abstact Factory)是一种常见的软件设计模式。该模式为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的
- 本章的前面讨论如何使用SQL向一个表中插入数据。但是,如果你需要向一个表中添加许多条记录,使用SQL语句输入数据是很不方便的。幸运的是,My