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版)>感觉真的 ...
随机推荐
- [TYVJ]1519 博彩
传送门 AC自动机模板题,好吧我只是单纯的搞个AC自动机的模板. //TYVJ 1519 //by Cydiater //2016.10.18 #include <iostream> #i ...
- 从Paxos到ZooKeeper-四、ZooKeeper技术内幕
本文将从系统模型.序列化与协议.客户端工作原理.会话.服务端工作原理以及数据存储等方面来揭示ZooKeeper的技术内幕. 一.系统模型 1.1 数据模型 ZooKeeper的视图结构使用了其特有的& ...
- css的核心内容 标准流、盒子模型、浮动、定位等分析
1.块级元素:如:<div></div>2.行内元素:如:<span></span>从效果中看块级元素与行内元素的区别: 通过CSS的设置把行内元素转换 ...
- python学习笔记-(二)python入门
1.第一个python程序 1.1 直接打印输出 打开cmd,输入python进入到python交互式环境:(看到>>>是在Python交互式环境下:) 在python交互环境下输入 ...
- Win7、Ubuntu双系统正确卸载Ubuntu系统
正确的删除ubuntu方法如下: 第1步,修复MBR 1.进入win7,下载个软件MbrFix,放在C:windowssystem32文件夹中 2.点击开始>所有程序>附件>命令提示 ...
- easyUI中tree的简单使用
一.在JS中的代码 $('#tt').tree({ url: baseCtx + 'lib/easyui-1.4/demo/tree/tree_data1.json',//tree数据的来源,json ...
- 对Java垃圾回收最大的误解是什么
当 我还是小孩的时候,父母常说如果你不好好学习,就只能去扫大街了.但他们不知道的是,清理垃圾实际上是很棒的一件事.可能这也是即使在Java的世界中, 同样有很多开发者对GC算法产生误解的原因--包括它 ...
- 20145212《Java程序设计》实验报告二 《 Java面向对象程序设计》
20145212 实验二< Java面向对象程序设计> 实验内容 单元测试 三种代码 伪代码 百分制转五分制: 如果成绩小于60,转成"不及格" 如果成绩在60与70之 ...
- MySQL学习笔记——多表连接和子查询
多表连接查询 # 返回的是两张表的乘积 SELECT * FROM tb_emp,tb_dept SELECT COUNT(*) FROM tb_emp,tb_dept # 标准写法,每个数据库都能这 ...
- zepto.js的事件处理
能够深入理解zepto对事件的处理,那么整个JS的事件处理就应该差不多合格了,事件处理是JS语言的一个难点. 1. 首先来看$.event函数. JS中有很多事件,都是已经定义好了,我们直接调用就可以 ...