Javascript高级编程学习笔记(11)—— 垃圾回收机制
垃圾回收机制
垃圾回收机制,是保证脚本能长时间运行的重要机制
JS具有自动垃圾收集机制,也就是说执行环境会负责管理代码执行过程中使用的内存
与一些偏底层的语言(c、c++)不同,我们不需要手工地去管理内存的使用情况
因为JS替我们完成了需要内存的分配,以及无用内存的回收,然后释放其占用的内存。
其原理其实很简单,就是找出那些不再使用的内存释放掉就行,所以垃圾收集器会按照固定时间间隔来执行该操作
垃圾回收是针对局部变量的,因为全局变量会在浏览器关闭后自动释放内存,而局部变量不同,其只会在函数执行期间存在
所以垃圾收集器的主要任务是为那些无用的变量打上标记,以便释放其占用的内存
具体实现通常有以下两个策略:
标记清除
这是JS中最常用的垃圾收集方式,主要有以下两个步骤:
1.当变量进入环境时将其标记为“进入环境”(从逻辑上来说永远不能释放进入环境的变量,因为随时可能会用到)
2, 当变量离开环境时,标记为“离开环境”
然后在垃圾收集器运行时,会将所有变量打上标记,然后去掉环境中的变量和被环境引用的变量的标记
在上述操作完成后,清除那些被标记的变量的内存
引用计数
另外一种垃圾回收策略就是引用计数
什么意思呢?
就是说跟踪每一个值被引用的次数
这个次数怎么计算呢?
当声明了一个变量,并将一个引用类型的值赋值给该变量时,这个值的引用次数就是1
如果同一个值又被赋值给另一个变量,则这个值的引用次数加一
相反如果包含对这个值引用的变量取得了另一个值,那么这个值引用的次数就减一
当这个值的引用次数变为0时,就意味着这个值没有变量可以访问了,就可以释放该值的内存了
但是这一策略存在着许多问题
1.循环引用
即两个对象互相引用,导致引用次数始终为2,从而始终无法回收该内存
如下所示:
function problem(){
var objectA = new Object();
var objectB = new Object(); objectA.other = objectB;
objectB.other = objectA; }
这样的情况就会导致两个对象都无法被回收
2.IE中虽然JS是标记清除策略,但一些BOM、DOM对象是基于C++的组件对象模型实现的
该对象模型是计数策略,所以在IE中只要涉及这些对象的,都会存在循环引用的问题
PS.该问题在IE9被修复
在有的浏览器中可以手动触发垃圾收集进程
IE:window.collectGarbage()
Opera:window.opera.collect()
管理内存
为了优化JS的性能
最好手动解除不用变量的引用,这样就会被下一次运行的垃圾收集器清理
方法是:
将变量的值设为null
也叫做解除引用,局部变量会自动完成这一过程
PS.解除引用后该值的内存不会自动回收,解除引用的目的是让值脱离执行环境
垃圾回收机制中还有一些比较复杂的情况,将在后续的文章中讲到
Javascript高级编程学习笔记(11)—— 垃圾回收机制的更多相关文章
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- Javascript高级编程学习笔记(70)—— 事件(14)内存和性能
由于事件处理程序是现代的web程序交互能力的提供者 所以在日常实践中,我们免不了要向页面中添加大量的事件处理程序(不管是用于用户交互还是用于统计用户数据) 在创建GUI(图形用户界面)的语言(如C#) ...
- Javascript高级编程学习笔记(24)—— 函数表达式(2)闭包
昨天的文章中主要记录了,函数表达式与函数声明的区别 以及在JS中如何安全地使用递归 那么既然要深入地理解JS中的函数,闭包就是一个绕不开的概念 闭包 JS高编一书中对闭包的概念定义如下: 闭包是指有权 ...
- Javascript高级编程学习笔记(67)—— 事件(11)HTML5事件
DOM规范没有涵盖所有浏览器支持的所有事件 而许多浏览器出于满足用户需求,或解决特殊问题的目的,实现了一些自定义事件 HTML5列出了浏览器应该支持的所有事件,这里只讨论得到浏览器完善支持的事件(并非 ...
- Javascript高级编程学习笔记(94)—— Canvas(11) 合成
合成 除了之前介绍的属性之外,还有两个属性会应用到整个2d上下文中; globalAlpha 用于指定所有绘制的透明度 globalComposition 用于表示后绘制的图形怎样与先绘制的图形进行结 ...
- JavaScript高级编程学习笔记(第三章之一)
继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...
- Javascript高级编程学习笔记(35)—— DOM(1)节点
DOM JS由三部分组成 1.BOM 2.DOM 3.ECMAScript ES和BOM在前面的文章已经介绍过了 今天开始JS组成的最后一部分DOM(文档对象模型) 我们知道,JS中的这三个部分实际上 ...
- Javascript高级编程学习笔记(18)—— 引用类型(7)单体内置对象
什么是内置对象呢? js高级程序设计中给出的定义为:由ES规定不依赖于宿主环境的对象,这些对象在JS执行前就已经存在 前面我们介绍的引用类型都是内置对象 除了这些对象外ECMA还规定了两个单体内置对象 ...
- Javascript高级编程学习笔记(7)—— 函数
前几天有事耽搁了,今天继续更新 今天的主要内容是JS中的函数 这一篇主要讲函数的定义等内容,至于变量提升.执行环境.闭包.内存回收等内容在后面讲,高玩们可以不用看下面的正文了. 函数 首先来讲,函数对 ...
随机推荐
- Itellj Idea使用技巧
模板设置: 类模板:File–>Settings–>Editor–>File and Code Templates–>Includes–>File Header 输入缩写 ...
- Android Studio模拟器磁盘空间不足(Not enough disk space to run AVD)
在Android Studio中运行模拟器时,提示Error: Not enough disk space to run AVD '....'. Exiting.是说安装模拟的磁盘空间不足,导致无法运 ...
- yum源解释。。。。。
主要说明下如何配置linux上的本地yum源,主要关于一些原理上的说明. 1.yum是什么,yum源又是什么 在windows上安装一个软件,我们可以通过360管家.因为360管家提供了软 ...
- 正确理解c和c ++的复杂类型声明
本文作者girlrong是网易广州社区的C语言版版主,这篇文章被选在精华区.很是不错,不敢独享!据说她乐于助人,虚心诚恳,颇受网友欢迎.只可惜现在已退隐江湖了.在最近学习C语言过程中,了解些前辈大牛的 ...
- mysql学习笔记--数据操作
一.插入数据 1. 语法:insert into 表名 (字段名.字段名,...) values (值1,值2...) 2. 注意: a. 插入字段的个数和顺序与值的个数和顺序必须一致 b. 通过de ...
- 在Laravel中使用mongoDB
https://blog.csdn.net/weixin_38682852/article/details/80840678?utm_source=blogxgwz1 https://blog.csd ...
- leveldb 源码编译 vs版本
为什么要windows版本? 因为方便调试跟进 VS的体验真的很不错. 搜索了一段时间才发现GITHUB有windows版本的leveldb 但是使用VS编译也有不少坑 可以下载网络上的其他朋友的版本 ...
- MSSQL语句学习(查询表的总记录数)
如何高效查询表的总记录数(通用方法) SELECT COUNT(1) ROWS FROM product 野路子1:利用系统自带的存储过程SP_SPACEUSED,详细的使用方式推荐谷哥或度娘, EX ...
- Kali proxychains
1.什么是proxychains 在linux系统中有很多软件是不支持代理的,但是proxychains 却可以让不支持代理的软件 也能走代理通道,支持HTTP,HTTPS,SOCKS4,SOCKS5 ...
- 2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
传送门 题意:支持单点修改,维护子树里的最大连通子块和. 思路: 扯皮: bzojbzojbzoj卡常差评. 网上的题解大多用了跟什么最大子段和一样的转移方法. 但是我们实际上是可以用矩阵转移的传统d ...