Javascript 垃圾收集机制介绍理解


Posted in Javascript onMay 14, 2013

经常使用 Javascript 的人会琢磨其垃圾收集机制,Javascript 并不像 C,C++ 那样需要开发者手动去清除垃圾,在编写 Javascript 程序是,开发者无需关心内存使用问题,所需内存分配以及无用内存(垃圾)的回收完全实现了自动管理。究其根源,主要是程序收集那些不再使用的变量,并且释放其占用的内存。因此,垃圾收集机制会按照固定时间间隔,周期性反复的执行这一操作。

举例来说,局部变量只存在于函数内部,程序会为局部变量在栈内存或堆内存中分配对应的存储空间,当函数运行结束,局部变量所占用的内存就没有存在的必要了,这时程序会释放局部变量所占用的内存供其他变量使用。这是程序最简单释放内存的方法,但是很多时候,程序中变量会一直被使用,此时垃圾收集机制必须跟踪变量并且判断其是否被使用,是否可以释放其内存空间。

垃圾收集机制主要判断变量释放内存空间的方法有两个:其一是标记清除法,其二是引用计数法。

标记法,每个变量都有其运行环境,变量创建后会在某种环境中运行,比如创建一个局部变量,局部变量会运行在函数体内。当函数运行时,会标记局部变量为“进入环境”,当函数体运行结束后,意味着变量脱离了其运行环境,此时则将变量标记为“离开环境”。对于“离开环境”的变量,垃圾收集机制会进行相应记录,并且在下一个回收周期时将其释放。

引用计数法,跟踪记录每个值的被引用次数。声明一个变量并将一个引用类型值赋给该变量时,这个值得引用次数就是 1。如果同一个值又被赋给另外一个变量,则该值的引用次数加 1。相反,如果包含对这个值的引用的变量又取得另外一个值,这个值得引用次数减 1。当这个值得引用次数为 0 时,则说明没有办法再访问到此值,因此就可以将其占用的内存空间回收。当垃圾收集器在下一个周期运行时,会释放引用次数为零的值所占用的内存空间。(原文解释参考:Javascript 高级程序设计 - 第二版)

举个例子来说:

            function countMethod(){
                  var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                  var object2 = new Object(); // 声明变量,计数器由 0 变为 1
                  object1.method1 = object2;  // object1 计数器 -1,object2 计数器 +1
                  object2.method2 = object1;  // object1 计数器 +1,object2 计数器 -1
            }

此函数运行退出后,object1 的计数器读数为 1,object2 的计数器度数为 1。所以两个变量都不会被销毁。如果大量的这样的程序存在于函数体内,就会导致大量的内存被浪费而无法回收,从而导致内存的泄露。

上述问题解决方法,手动释放 object1 object2 所占用的内存。即:

                 object1.method1 = null;
                 object2.method2 = null;

对比上面的例子,举一个正常情况下的例子。
            function countMethod(){
                  var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                  var object2 = new Object(); // 声明变量,计数器由 0 变为 1
                  object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
                  object2.method2 = "This is object2";  // object2 计数器 -1,object2 读数变为0
            }

通过上例看出,正常情况下,当函数运行结束后,object1 object2的读数均为 0,在下一个垃圾收集周期时,会被回收并且释放其所占用的内存。
Javascript 相关文章推荐
showModelessDialog()使用详解
Sep 21 Javascript
JavaScript 计算图片加载数量的代码
Jan 01 Javascript
javascript通过class来获取元素实现代码
Feb 20 Javascript
JavaScript 创建运动框架的实现代码
May 08 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
Oct 17 Javascript
JavaScript实现页面5秒后自动跳转的方法
Apr 16 Javascript
ajax跨域调用webservice的实现代码
May 09 Javascript
Node.JS更改Windows注册表Regedit的方法小结
Aug 18 Javascript
js实现图片粘贴上传到服务器并展示的实例
Nov 08 Javascript
mpvue小程序仿qq左滑置顶删除组件
Aug 03 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
Nov 10 Javascript
Vue中全局变量的定义和使用
Jun 05 Javascript
JavaScript实现GriwView单列全选(自写代码)
May 13 #Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
May 13 #Javascript
js 程序执行与顺序实现详解
May 13 #Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
May 13 #Javascript
JS 加入收藏夹的代码(主流浏览器通用)
May 13 #Javascript
jQuery实现长文字部分显示代码
May 13 #Javascript
jq选项卡鼠标延迟的插件实例
May 13 #Javascript
You might like
PHP7匿名类用法分析
2016/09/26 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
vue cli 全面解析
2018/02/28 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
python实现感知机模型的示例
2020/09/30 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
python实现简单的学生管理系统
2021/02/22 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
乡镇纠风工作实施方案
2014/03/22 职场文书
体育比赛口号
2014/06/09 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
2014年党总支工作总结
2014/12/18 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
python 中的@运算符使用
2021/05/26 Python