`
wuzijingaip
  • 浏览: 334595 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

javascript 释放内存

阅读更多



首先看一个内存释放的实例:
<SCRIPT LANGUAGE="JavaScript">
<!--
strTest = "1";
for ( var i = 0; i < 25; i ++ )
{
 strTest += strTest;
}
alert(strTest);
delete strTest;
CollectGarbage();
//-->
</SCRIPT>

CollectGarbage,是IE的一个特有属性,用于释放内存的,使用方法嘛应该是,将该变量或引用对象,设置为null或delete,然后在进行释放动作,在做CollectGarbage前,要必需清楚的两个必备条件:

引用
- 一个对象在其生存的上下文环境之外,即会失效。
- 一个全局的对象在没有被执用(引用)的情况下,即会失效。
//---------------------------------------------------------
// JavaScript对象何时失效
//---------------------------------------------------------


function testObject() {
var _obj1 = new Object();
}

function testObject2() {
var _obj2 = new Object();
return _obj2;
}

// 示例1
testObject();

// 示例2
testObject2()

// 示例3
var obj3 = testObject2();
obj3 = null;

// 示例4
var obj4 = testObject2();
var arr = [obj4];
obj3 = null;
arr = [];


在这四个示例中:
- “示例1”在函数testObject()中构造了_obj1,但是在函数退出时,
它就已经离开了函数的上下文环境,因此_obj1失效了;
- “示例2”中,testObject2()中也构造了一个对象_obj2并传出,因
此对象有了“函数外”的上下文环境(和生存周期),然而由于函数
的返回值没有被其它变量“持有”,因此_obj2也立即失效了;
- “示例3”中,testObject2()构造的_obj2被外部的变量obj3持用了,
这时,直到“obj3=null”这行代码生效时,_obj2才会因为引用关系
消失而失效。
- 与示例3相同的原因,“示例4”中的_obj2会在“arr=[]”这行代码
之后才会失效。

但是,对象的“失效”并不等会“释放”。在JavaScript运行环境的内部,没
有任何方式来确切地告诉用户“对象什么时候会释放”。这依赖于JavaScript
的内存回收机制。——这种策略与.NET中的回收机制是类同的。

在前面的Excel操作示例代码中,对象的所有者,也就是"EXCEL.EXE"这个进程
只能在“ActiveX Object实例的释放”之后才会发生。而文件的锁,以及操作
系统的权限凭证是与进程相关的。因此如果对象仅是“失效”而不是“释放”,
那么其它进程处理文件和引用操作系统的权限凭据时就会出问题。

——有些人说这是JavaScript或者COM机制的BUG。其实不是,这是OS、IE
和JavaScript之间的一种复杂关系所导致的,而非独立的问题。

Microsoft公开了解决这种问题的策略:主动调用内存回收过程。

在(微软的)JScript中提供了一个CollectGarbage()过程(通常简称GC过程),
GC过程用于清理当前IE中的“失效的对象失例”,也就是调用对象的析构过程。

在上例中调用GC过程的代码是:
//---------------------------------------------------------
// 处理ActiveX Object时,GC过程的标准调用方式
//---------------------------------------------------------

function writeXLS() {
//(略...)

excel.Quit();
excel = null;
setTimeout(CollectGarbage, 1);
}


第一行代码调用excel.Quit()方法来使得excel进程中止并退出,这时由于JavaScript
环境执有excel对象实例,因此excel进程并不实际中止。

第二行代码使excel为null,以清除对象引用,从而使对象“失效”。然而由于
对象仍旧在函数上下文环境中,因此如果直接调用GC过程,对象仍然不会被清理。

第三行代码使用setTimeout()来调用CollectGarbage函数,时间间隔设为'1',只
是使得GC过程发生在writeXLS()函数执行完之后。这样excel对象就满足了“能被
GC清理”的两个条件:没有引用和离开上下文环境。

GC过程的使用,在使用了ActiveX Object的JS环境中很有效。一些潜在的ActiveX
Object包括XML、VML、OWC(Office Web Componet)、flash,甚至包括在JS中的VBArray。
从这一点来看,ajax架构由于采用了XMLHTTP,并且同时要满足“不切换页面”的
特性,因此在适当的时候主动调用GC过程,会得到更好的效率用UI体验。

事实上,即使使用GC过程,前面提到的excel问题仍然不会被完全解决。因为IE还
缓存了权限凭据。使页的权限凭据被更新的唯一方法,只能是“切换到新的页面”,
因此事实上在前面提到的那个SPS项目中,我采用的方法并不是GC,而是下面这一
段代码:
//---------------------------------------------------------
// 处理ActiveX Object时采用的页面切换代码
//---------------------------------------------------------

function writeXLS() {
//(略...)

excel.Quit();
excel = null;

// 下面代码用于解决IE call Excel的一个BUG, MSDN中提供的方法:
// setTimeout(CollectGarbage, 1);
// 由于不能清除(或同步)网页的受信任状态, 所以将导致SaveAs()等方法在
// 下次调用时无效.
location.reload();
}


delete 运算符在手册上的说明

引用
从对象中删除一个属性,或从数组中删除一个元素。

delete expression

expression 参数是一个有效的 JScript 表达式,通常是一个属性名或数组元素。

说明
如果 expression 的结果是一个对象,且在 expression 中指定的属性存在,而该对象又不允许它被删除,则返回 false。

在所有其他情况下,返回 true。

最后之最后,关于GC的一个补充说明:在IE窗体被最小化时,IE将会主动调用一次
CollectGarbage()函数。这使得IE窗口在最小化之后,内存占用会有明显改善。
分享到:
评论

相关推荐

    javascript 数组内存释放

    本篇文章将深入探讨JavaScript数组的内存释放机制,以及如何有效地管理数组内存。 首先,理解JavaScript的内存管理机制至关重要。JavaScript使用了一种称为垃圾回收(Garbage Collection, GC)的自动内存管理系统,...

    Javascript 不能释放内存.

    所以不能使用javascript释放内存. 我遇到这样的情况,建立一个数组,我们没有办法删除这个数组,让数据重新建立.Javascript只提供了Delete方法来清空变量为空. 例如: Var OA=new Array(“Hello”,”Good”,”Yes”) ...

    JavaScript_内存泄露

    在JavaScript中,程序员不需要手动释放内存,因为引擎会自动进行垃圾回收。当一个对象不再有任何引用指向它时,垃圾回收器会识别出这个对象为"无用"状态,进而将其从内存中释放。例如,如果你创建了一个数组`var s =...

    Javascript内存泄露

    在早期版本的Internet Explorer(如IE6)中,存在一种特殊的内存泄露情况,即当DOM元素或ActiveX对象与普通的JavaScript对象之间存在循环引用时,IE在释放这类变量时存在特殊困难,导致内存无法正常回收。...

    JavaScript避开内存泄露及内存管理技巧_.docx

    JavaScript的垃圾回收机制可以自动释放对象的内存。开发者可以通过使用delete语句删除对象的属性来帮助垃圾回收机制释放对象的内存。 3. 避免闭包 在JavaScript中,闭包是一个常见的内存泄露来源。开发者可以避免...

    JavaScript内存泄漏的处理方式

    1. 严格管理内存生命周期:这包括分配内存、使用内存和释放内存。虽然JavaScript的垃圾收集器能够自动处理后两部分,但开发者应尽量避免造成内存泄漏的不良编码习惯。 2. 避免循环引用:循环引用是指两个或多个对象...

    JavaScript内存管理相关.docx

    #### 五、释放内存 在JavaScript中,内存的释放是由垃圾回收机制自动完成的。然而,如何确定哪些内存已经不再需要是一个复杂的问题。通常情况下,这需要依赖于垃圾回收算法来追踪内存的使用情况。 #### 六、垃圾...

    javascript内存泄露问题的解析

    这本身并没有问题,但是垃圾回收器(一种自动的内存资源管理器)应该将它们回收并释放内存。然而,在IE浏览器中,DOM的内存并不能被Jscript所管理。这套系统不知道循环引用,使得一切变得混乱,导致内存释放工作不能...

    JavaScript 内存机制分析

    例如,C语言提供了低级别的内存管理功能,如`malloc()`和`free()`等函数,用于手动分配和释放内存。而在JavaScript中,内存管理机制更为自动化,这使得开发者可以更专注于业务逻辑而非底层细节。然而,深入理解...

    JavaScript内存统计专题图示例

    当这些变量不再被引用时,垃圾回收器会识别并释放这些内存,以防止内存泄漏。 在JavaScript中制作内存统计专题图,我们通常会涉及以下几个关键知识点: 1. 数据处理:首先,你需要将原始数据转换为适合绘图的格式...

    JavaScript的内存释放问题详解

    这意味着开发者不需要手动分配或释放内存,JavaScript运行环境会在适当的时候自动回收那些不再使用的内存空间。然而,自动垃圾回收并不意味着开发者可以忽略内存问题,了解其工作原理对于编写高效且无内存泄漏的代码...

    sIEve-0.0.8-javascript内存泄漏检测工具

    然而,由于其异步执行模型和垃圾回收机制,JavaScript在处理内存管理时可能会出现一些问题,尤其是内存泄漏。内存泄漏是指程序在分配内存后无法正确释放,导致系统资源持续消耗,从而影响程序性能甚至可能导致系统...

    JAVASCRIPT实现的CPU内存监控

    虽然`performance.memory`提供了内存使用情况,但JavaScript本身没有提供释放内存或精确控制内存的方法。开发者需要依赖良好的编程习惯,如及时释放不再使用的引用,避免内存泄漏。 5. **事件循环和垃圾回收**: ...

    javascript 内存模型实例详解

    当函数执行完毕,栈帧会从栈顶弹出,释放内存。栈内的内存分配是线性的,空间有限,且变量生命周期短。 - **堆**:负责存储引用数据类型,如对象和数组。堆内存可以动态扩展,存储复杂结构的数据。例如,声明一个...

    内存javascript脚本

    JavaScript采用自动内存管理机制,这意味着开发者无需手动分配或释放内存。这一特性简化了编程过程,但也可能导致一些难以察觉的问题,比如内存泄漏。 #### 垃圾回收 JavaScript引擎通过垃圾回收机制来清理不再使用...

    【JavaScript源代码】一篇文章弄懂javascript内存泄漏.docx

    当对象不再被引用时,垃圾回收器会清除堆中的对象,释放内存。V8引擎的垃圾回收包括几个步骤:标记、清除、整理等,以确保有效利用内存资源。 开发者在编写JavaScript代码时,需要注意以下几点以避免内存泄漏: 1....

    JavaScript_内存Postgres用于unitE2E测试.zip

    JavaScript使用自动垃圾回收机制来管理内存,当一个对象不再被引用时,垃圾回收器会将其占用的内存释放。然而,程序员仍需要理解如何避免内存泄漏,例如通过及时解除不再使用的对象引用,防止闭包过度持有变量,以及...

    测试JavaScript在IE中的内存泄露

    JavaScript是一种广泛应用于Web开发的脚本语言,它在运行时动态分配和释放内存。然而,在某些情况下,尤其是在老版本的Internet Explorer(IE)浏览器中,可能会出现内存泄露问题。内存泄露是指程序在申请内存后,...

    JavaScript中的内存泄漏检测方法研究.pdf

    8. 动态内存管理:动态内存管理是指在程序运行时动态地分配和释放内存,以避免内存泄漏的问题。 9. 静态内存泄漏检测:静态内存泄漏检测是指在编译时检测内存泄漏的问题,以避免内存泄漏的出现。 10. 动态内存泄漏...

    javascript的内存管理详解

    在JavaScript中,内存的分配和回收是由垃圾回收机制自动处理的,这使得开发者无需显式地去释放内存,从而降低了编程的复杂性。 首先,内存管理的基本流程在所有编程语言中都是相似的,包括三个主要步骤:内存分配、...

Global site tag (gtag.js) - Google Analytics