Javascript高级程序设计——垃圾收集
javascipt具有自动垃圾回收机制
局部变量只在函数执行过程中存在,在这个过程中,会为局部变量在栈上(或堆)内存分配相应空间,来储存他们的值,当函数执行完,局部变量就没有存在的必要了,所以这个时候可以释放他们的内存。而垃圾收集器必须跟踪那个变量有用,那个变量没用,对不用的变量打上标记,以便回收。
标记清除:
当变量进入环境时,就将这个变量标记为”进入环境“,当离开环境时标记为”离开环境”等待内存回收。
引用计数:
引用计数就是跟踪记录每个值被引用的次数,当声明一个变量,并将一个应用类型值赋值给该变量, 则这个值的引用次数就是1,如果同一个值又被引用给另外一个变量,则这个值的引用次数加一,如果包含这个值引用的变量又取另外的值,这个值的引用减一。
当引用次数为0时,说明没办法访问这个值,因而就可以将其占用的内存空间回收。
引用计数的问题:循环引用
function cricle(){
var objA = new Object();
var objB = new Object(); objA.someObj = objB;
objB.someObj = objA;
}
//这个例子中objA和objB通过属性相互引用,引用次数都是2,函数执行完后他们的引用次数永远都不会是0,将无法回收。IE中的一部分对象是com,采用的引用计数的回收机制。 为了避免循环引用问题,可以手动消除循环引用
函数执行完后:
objA.someObj = null;
objB.someObj = null;
切断了与之前引用值之间连接,下次垃圾收集器就会删除这些值回收内存。
管理内存:
通常浏览器的可用内存是比分配给桌面应用程序少的,为提升性能一般只为执行代码保存必要的数据,一旦数据不再用,最后通过将其置为null,来释放器引用,即解除引用。
function createPerson(name){
var localPerson = new Object();
localPerson.name = name; return localPerson;
} var globalPerson = createPerson("yangxunwu"); 执行代码段。。。 手动解除引用。
globalPerson = null;createPerson()创建了全局变量globalPerson后,当不再使用这个数据时手动解除引用,等待下次垃圾收集器运行时回收,而不是立即回收。
小结:
javascript变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自一下5种基本数据类型:Undefined、Null、Boolean、String、Number。引用类型如Object的各种实例。
- 基本类型在内存中占固定大小空间,因此会保存在栈内存中;
- 从一个变量向另一个变量复制基本类型的值时,会创建这个值副本。
- 引用类型的值是对象,保存在堆内存中,引用类型的值是指向对象的指针。
- 从一个变量向另一个变量复制引用类型的值,复制的是指针,因而两个变量都指向同一个对象
- 确定一个值是哪个基本类型可以使用,typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符。
javascript具有自动垃圾收集机制的编程语言,开发人员不必关系内存的分配和回收问题。
- 离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。
- “标记清除”是目前主要的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,以后在回收。
- 另一种是“引用计数”,跟踪所以值被引用的次数,可能会导致循环引用的问题。
- 解除变量的引用有助于消除循环引用的问题,而且对垃圾收集也有好处,为确保有效的回收内存,应该及时消除不再使用的全局对象、全局对象属性和循环引用变量的引用。
Javascript高级程序设计——垃圾收集的更多相关文章
- 《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第四章内容. 1.函数:通过函数可以封装 ...
- 读书时间《JavaScript高级程序设计》一:基础篇
第一次看了<JavaScript高级程序设计>第二版,那时见到手上的书,第一感觉真是好厚的一本书啊.现在再次回顾一下,看的是<JavaScript高级程序设计>第三版,并记录一 ...
- JavaScript高级程序设计---学习笔记(一)
今天,2017.3.17开始利用课余时间仔细学习<JavaScript高级程序设计>,将需要掌握的知识点记录下来,争取把书里的所有代码敲一遍并掌握. 1.标识符命名最好是第一个字母小写,剩 ...
- JavaScript高级程序设计学习(三)之变量、作用域和内存问题
这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于ja ...
- 《Javascript高级程序设计》阅读记录(七):第七章
<Javascript高级程序设计>中,2-7章中已经涵盖了大部分精华内容,所以摘录到博客中,方便随时回忆.本系列基本完成,之后的章节,可能看情况进行摘录. 这个系列以往文字地址: < ...
- 《Javascript高级程序设计》阅读记录(二):第四章
这个系列之前文字地址:http://www.cnblogs.com/qixinbo/p/6984374.html 这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较 ...
- JavaScript高级程序设计第三版.CHM【带实例】
从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...
- javascript高级程序设计学习笔记
javascript高级程序设计,当枕头书已经好久了~zz 现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...
- 《JavaScript高级程序设计(第3版)》笔记-序
很少看书,不喜欢看书,主要是上学时总坐不住,没有多大定性,一本书可以两天看完,随便翻翻,也可以丢在角落里几个月不去动一下. 上次碰到了<JavaScript高级程序设计(第3版)>感觉真的 ...
随机推荐
- Vijos1921严厉的班长
传送门 在贴吧上看到了这道题,恰好最近在学相关的东西,觉得比较有意思就去做了. 第一眼看上去比较像搜索,其实是道状压DP.我简单讲一下思路: 首先明确,不管之前取了什么数,取1必定满足所有的数之间互质 ...
- angular 兼容ie7 实现
<script src="~/Content/js/angular.min.js"></script><script src="~/Cont ...
- llinux 查看自己的公网ip
如何在LINUX服务器下查看公网IP地址,可以使用下面的方法: [root@web ~]#curl http://members.3322.org/dyndns/getip [root@web ~]# ...
- rem自适应布局的回顾总结
使用rem实现自适应布局,应该算是当前移动前端的一大趋势,有些人对此还有点迷惑,搞不懂rem是如何实现自适应布局,如何根据设计稿来调整rem的值?rem布局如何用雪碧背景图片?rem一定要加载JS吗? ...
- DllMaps
http://www.mono-project.com/docs/advanced/pinvoke/dllmap/ http://www.mono-project.com/docs/advanced/ ...
- Cpu Gpu 内存 显存 数据流
[精]从CPU架构和技术的演变看GPU未来发展 http://www.pcpop.com/doc/0/521/521832_all.shtml 显存与纹理内存详解 http://blog.csdn.n ...
- js的DOM对象
1.js的Array对象 ** 创建数组(三种) - var arr1 = [1,2,3]; ...
- ssh-keygen不是内部或外部命令
在**/Git/usr/bin目录下找到ssh-keygen.exe,将**/Git/usr/bin路径添加到环境变量中
- C# Emit动态代理生成一个实体对象
/// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...
- asp.net webform中使用async,await实现异步操作
摘要 最近想着将项目中的部分耗时的操作,进行异步化.就自己弄个demo进行学习.只需下面几个步骤就可以将aspx页面中注册异步操作. demo 比如我们需要抓取某个url的内容,这个时候我们可能会有下 ...