浅谈javascript垃圾收集机制

原创 2017年01月03日 17:58:49

今天想要分享的小知识,是关于javascript的垃圾收集机制(GC(Garbage Collection) )。

自动垃圾收集机制

不同于C/C++需要编程人员手动跟踪内存的使用情况,javascript拥有一套自动垃圾收集机制,也就是说,在我们的开发过程中,并不用去考虑内存的分配和回收问题,这些问题都由执行环境负责,它自动管理代码执行过程中内存的分配与回收,让编码人员能将更多精力放在业务功能实现。而手动跟踪内存自身也有其弊端,例如很繁琐,变量数目很多时人工操作很容易遗漏,造成资源浪费等。

自动垃圾收集机制,它的原理其实很简单:
确定变量中有哪些还在使用,哪些已经不再使用,然后垃圾收集器会按照固定的时间间隔去周期性的释放已经不再继续使用的变量所占的内存。

但是怎么界定变量有没有被使用,就需要考虑它的生命周期。

变量的生命周期

在不考虑卸载页面,注销系统的基础上,全局变量是一直都会存在的,因为系统不明确什么时候还会用到它,所以全局变量通常不会被垃圾收集机制所回收。js面试中的另一个特色问题闭包之所以能够在函数外部读取函数内部局部变量,保证该局部变量不被垃圾收集器回收,就是因为定义了一个外部引用,使得整个函数与全局变量连接在一起。(说的比较笼统,之后在闭包部分详述)

而局部变量只在函数执行的过程中存在,在这个过程中,会为局部变量分配内存空间,用来储存它的值。当函数结束时,局部变量就可以界定为不再继续使用,于是就会释放它的内存。但这只是很简单的一种情况,随着实现的不同,垃圾收集器对“有用”,“无用”的标示策略也不同,总体来说,有以下两种:

  1. 标记清除
  2. 引用计数

标记清除法

标记清除是javascript中最常用的垃圾收集机制。简单的来说就是:变量进入环境(即执行上下文,例如全局环境、函数环境),标记该变量进入环境;出环境则标记变量离开环境。

然后垃圾收集器会保留环境中的变量和被环境中变量引用的变量(其实就是闭包),定时循环释放除此之外的离开环境的变量的内存。大多现代浏览器都采取这个策略进行垃圾收集,它们之间的区别在于垃圾收集器的回收间隔时间。

引用计数法

要明确引用计数法,首先需要了解什么是引用?

此处的引用是指一个对象对另一个对象的访问权限,可以访问,则表示这个对象引用另一个对象。

引用计数法并不常用,出现在IE早期,它的原理也很简单:跟踪每个值被引用的次数,当声明变量并赋给他一个引用类型的值时,则该值引用次数为1,将其赋给另一个变量时,引用次数就变为2,以此类推;相反,如果引用这个值的那个变量引用了别的值,那么这个值的引用次数就减1,当然新引用的那个值的次数加1。最后,当次数变为0时,则默认改值已不再被需要,就会被回收器回收。

但是该方法有一个巨大缺陷,就是它存在循环引用:

function referenceCount() {
    var variable_a = {};
    var variable_b = {};
    variable_a.prop = variable_b;
    variable_b.prop = variable_a;
}
referenceCount();

此时variable_a, variable_b通过各自属性相互引用,但是函数已经执行完毕,本来应该将这两个对象所占内存释放,但在引用计数法中它们不会被回收。


以上,就是关于javascript中垃圾收集机制的一些简单介绍。虽然它可能对我们实际编程意义不大,但是对我们了解javascript这门语言的运行机制,还是很有帮助的。因为我也是前端届的小学生,如有问题,希望大家严厉指出,谢谢。

版权声明:本文为博主原创文章,未经博主允许不得转载。

垃圾收集机制的批判

垃圾收集机制的批判[原创] myan 2004-05-26 在Java版发表这篇文章,似乎械惆衙分赶騄ava了。其实不是,GC是所有新一代语言共有的特征,Python, Eiffel,C#,Roby...
  • Flyingfoxoo
  • Flyingfoxoo
  • 2004年06月07日 09:51
  • 600

java垃圾收集机制(GC)

java GC机制主要完成3件事:确定那些内存要回收,确定什么时候需要执行GC,如何执行GC。我们从四个方面学习GC机制:1,内存是如何分配的。2,如何>保证内存不被错误回收(即为:那些内存需要回收)...
  • yubotianxiao
  • yubotianxiao
  • 2016年06月22日 09:49
  • 728

PHP 的垃圾收集机制

PHP 的垃圾收集机制是怎样的 PHP作为脚本语言是页面结束即释放变量所占内存的。 当一个 PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁。GC进程一般都跟着每...
  • ssdfsfdf
  • ssdfsfdf
  • 2016年03月04日 17:49
  • 269

Mono Runtime 的垃圾回收

Mono 当前用 Boehm 的 GC 作为垃圾回收引擎。
  • cuit
  • cuit
  • 2014年11月07日 15:21
  • 1665

垃圾收集机制

 写作本文的初衷是想和大家分享垃圾收集( Garbage Collection )技术简单而有趣的发展史。动笔之前,我站在窗边,望了望正在小区里装运垃圾的清洁车。和生活中环卫工人们清运垃圾的工作相似,...
  • HappyTree
  • HappyTree
  • 2007年01月06日 08:04
  • 629

浅谈JavaScript垃圾收集——标记清除和引用计数

JavaScript具有自动垃圾回收机制:标记清除法和引用计数法。 1、标记清除法: 2、引用计数法:...
  • zhouziyu2011
  • zhouziyu2011
  • 2017年03月10日 17:34
  • 1405

【JavaScript】——浅谈js(JavaScript)

【前言】             学习javascript的知识,原来在浏览网页时炫酷的动态效果就是js在幕后操作,js在Web开发中扮演着重要的角色,被广泛应用到各个领域:地图搜索,,用户注册、验证...
  • zt15732625878
  • zt15732625878
  • 2017年02月20日 17:09
  • 415

垃圾收集方式

垃圾收集算法 1、标记清除算法       标记清除算法分为标记和清除两个阶段,首先标记出所要回收的对象,在标记完后统一回收所有被标记的对象。有两点不足,一是效率问题,标记清除两个过程的效率都不高;...
  • liyantianmin
  • liyantianmin
  • 2017年01月05日 01:12
  • 409

《浅谈Java设计模式之原理简述》系列技术文章整理收藏

《浅谈Java设计模式之原理简述》系列技术文章整理收藏 用简单的样例深入浅出Java设计模式 1浅谈Java设计模式(一)工厂模式 2浅谈Java设计模式(一)工厂模式 3浅谈Java...
  • hello_katty
  • hello_katty
  • 2016年12月17日 12:15
  • 454

php 垃圾收集机制

每一种语言都有自己的自动垃圾回收机制,让程序员不必过分关心程序内存分配,但是在OOP中,有些对象需要显式的销毁;防止程序执行内存溢出。 PHP 垃圾回收机制(Garbage Collector 简称G...
  • qq_31617637
  • qq_31617637
  • 2017年05月14日 15:26
  • 502
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈javascript垃圾收集机制
举报原因:
原因补充:

(最多只允许输入30个字)