JavaScript CollectGarbage函数案例详解

 更新时间:2021年08月28日 14:55:07   作者:bigwhiteshark(云飞扬)  
这篇文章主要介绍了JavaScript CollectGarbage函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

首先看一个内存释放的实例:

<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 CollectGarbage函数案例详解的文章就介绍到这了,更多相关js CollectGarbage函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript中net::ERR_CONNECTION_REFUSED解决方法大全

    JavaScript中net::ERR_CONNECTION_REFUSED解决方法大全

    在一次测试中遇到了报net::ERR_CONNECTION_REFUSED的错误,五哦一下面这篇文章主要给大家介绍了关于JavaScript中net::ERR_CONNECTION_REFUSED解决方法的相关资料,需要的朋友可以参考下
    2022-10-10
  • JS树形结构根据id获取父级节点元素的示例代码

    JS树形结构根据id获取父级节点元素的示例代码

    这篇文章主要介绍了JS树形结构根据id获取父级节点元素,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 原生javascript实现拖动元素示例代码

    原生javascript实现拖动元素示例代码

    首先改变被拖动元素的布局属性,接着捕捉鼠标事件,当触发mousedown时,记录下当前鼠标在元素中的相对位置,接着处理mousemove事件
    2014-09-09
  • JS面试之对事件循环的理解

    JS面试之对事件循环的理解

    这篇文章主要为大家介绍了JS面试之对事件循环的理解分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • JS什么场景不适合箭头函数

    JS什么场景不适合箭头函数

    这篇文章主要介绍了JS什么场景不适合箭头函数,对箭头函数感兴趣的同学,可以参考下
    2021-04-04
  • sogou地图API用法实例教程

    sogou地图API用法实例教程

    这篇文章主要介绍了C# sogou地图API用法,包括了各种常用属性的用法实例,需要的朋友可以参考下
    2014-09-09
  • 原生js自定义右键菜单

    原生js自定义右键菜单

    这篇文章主要为大家详细介绍了原生js自定义右键菜单,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • JS实现简单的键盘打字的效果

    JS实现简单的键盘打字的效果

    本文给大家分享的是使用javascript实现的简单的键盘打字效果,十分的简单实用,推荐给有需要的小伙伴参考下。
    2015-04-04
  • 通过DOM脚本去设置样式信息

    通过DOM脚本去设置样式信息

    在大多数场合,我们都用CSS去设置样式,但在某些特殊情况下,例如要根据元素在节点树里的位置来设置节点样式信息时,目前CSS还没办法做到这一点。但利用DOM就可以很轻易的完成。
    2010-09-09
  • 浏览器视频帧操作方法 requestVideoFrameCallback()

    浏览器视频帧操作方法 requestVideoFrameCallback()

    这篇文章主要介绍了浏览器视频帧操作方法 requestVideoFrameCallback(),文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07

最新评论