javascript如何释放内存
- 一个全局的对象在没有被执用(引用)的情况下,即会失效。
例如:
//---------------------------------------------------------
// 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();
}
最后之最后,关于GC的一个补充说明:在IE窗体被最小化时,IE将会主动调用一次
CollectGarbage()函数。这使得IE窗口在最小化之后,内存占用会有明显改善
javascript如何释放内存相关推荐
- JavaScript中的内存释放
一.如何查找上级作用域 在 JavaScript中的预解析 ,有讲到作用域链的概念,本次在正式讲JavaScript中的内存释放之前,先看一个问题:如何查找当前作用域的上级作用域. var num = ...
- 【进阶1-3期】JavaScript深入之内存空间详细图解
本期的主题是调用堆栈,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章. 如果觉得本系列不错,欢迎点赞.评论.转发,您的支持就是我坚持的最大动力. 堆栈的内 ...
- javascript中的内存管理
文章目录 简介 内存生命周期 JS中的垃圾回收器 引用计数垃圾回收算法 Mark-and-sweep回收算法 调试内存问题 闭包Closures中的内存泄露 简介 在c语言中,我们需要手动分配和释放对 ...
- 为什么要free释放内存_为什么在Free Code Camp上列出一份工作要花1,000美元?
为什么要free释放内存 by Michael D. Johnson 迈克尔·约翰逊(Michael D.Johnson) 为什么在Free Code Camp上列出一份工作要花1,000美元? (W ...
- vue 释放内存_13 道由浅入深的 Vue 自测题
Vue框架部分我们会涉及一些高频且有一定探讨价值的面试题,我们不会涉及一些非常初级的在官方文档就能查看的纯记忆性质的面试题,比如: vue常用的修饰符? vue-cli 工程常用的 npm 命令有哪些 ...
- 如何避免 JavaScript 中的内存泄漏?
大家好,我是CUGGZ.SPA(单页应用程序)的兴起,促使我们更加关注与内存相关的 JavaScript 编码实践.如果应用使用的内存越来越多,就会严重影响性能,甚至导致浏览器的崩溃.下面就来看看Ja ...
- 频繁分配释放内存导致的性能问题的分析--brk和mmap的实现
现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C pr ...
- linux手动释放内存的方法
Linux手动释放缓存的方法 Linux释放内存的命令: sync echo 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同 ...
- 释放内存触发断点及数组、指针的NULL初始化
Visual Studio调试时,出现"触发一个断点"内存释放出现异常 数组和对应指针的NULL初始化 数组使用之前要先对其初始化 char Outi[4] = { NULL }; ...
最新文章
- 两套代码详解LSTM-RNN——有记忆的神经网络
- matlab+snapshot采集图片
- [转]解决 cannot restore segment prot after reloc: Permission denied
- 2021 4th ICICT conference presentation notes!
- boost::posix_time模块实现本地时间和 UTC 之间的转换的测试程序
- emd实现信息隐藏_【读书笔记】深入理解TensorFlow架构设计与实现原理(五)
- SLAM系统工程,常用数据集下载链接(TUM KITTI DSO Mono EuRoC)
- Thread线程的深刻理解和代理方法参数[有图有真相]
- jquery-窗口滚动事件-属性操作
- 10 亿产业基金加持,让精准定位在物联网应用中实现无限可能!
- c语言if的判定条件,if条件判断语句,谁能帮我分析一下?
- SQLite.Net操作类
- EasyRecovery易恢复15免费数据恢复软件功能介绍
- 【基于物理的渲染(PBR)白皮书】(四)法线分布函数相关总结
- 日期插件layui的》laydate
- vwf活性_血管性血友病因子(VWF)应该针对血型设置参考范围吗?
- 关于tensorflow版本更新
- word不能复制粘贴,提示激活宏
- 昨日关注:唐骏说盛大、微软、比尔盖茨及营销
- u盘文件名乱码的恢复方法
热门文章
- 重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口...
- steps/align_si.sh
- NSNumber 以及NSInteger,NSNumber以及Int的区别
- 文件上传到ubuntu -- WinSCP 登录ftp服务器
- Jenkins邮件配置,实现邮件发送策略(可实现每个Job对应不同的发送邮箱)
- 关于chm文件打不开的解决方案
- Siverlight5新功能/改进总结
- 编程方法学笔记:karel和java
- 如何在CentOS 5/6上安装EPEL源
- 基于VTK User Guide和VTK Textbook学习