如果有人问.net的垃圾回收,大家会马上想到gc,那如果有人问你javascript如何进行内存管理的呢?挠挠头,一口香瓜,听我细细道来!

javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存,大体的原理是找出那些不在使用的变量,然后释放它占用的内存,为此,垃圾收集器会按照固定的时间间隔周期的执行这一操作。(让我想起了oc中内存管理是通过引用计数来判定对象是否使用的)下面介绍一下javascript中常用的垃圾回收方式.(没想到这时候的香瓜这么甜,打几行字就得来几口。)

(1)标记清除

当变量进入环境时候,就将这个变量标记为进入环境。垃圾收集器会给存储在内存中的所有变量都加上标记,然后他会去掉环境中的变量以及被环境中的变量引用的变量的标记,再次之后再被加上标记的变量被视为准备删除的变量。因为环境中的变量已经无法访问这些变量了。

(2)引用计数

跟踪记录每个值引用的次数。当声明一个变量并且将一个引用类型值赋给该变量时,这个值得引用计数就是1.如果同一个值又被付给另一个变量。该值引用次数加1,反之,减法操作。当这个值得引用次数变为0时候,则说明没有办法在访问这个值了。可以回收内存空间了。当垃圾收集器再次运行时。他就会释放引用次数为0的值。但是引用计数存在着循环引用的问题。

var element=document.getElementById("ele");
var obj=new Object();
obj.element=element;
element.obj=obj;

为了避免这种问题我们只能手动断开连接

obj.element=null
element.obj=null

  (在object-c中为了避免这种引用的关系,采用了强引用和弱引用的概念)

小结:

javascript变量可以保存2中类型的值:基本类型和引用类型   基本类型(undefined,null,boolean,number, string) 这里的string是值类型

切记与.net中string引用类型弄混,.net处理string类型还单独用了一个集合类存储.

(1)基本类型的值在内存中占据固定大小的空间,因此被保存在栈内存中。

(2)从一个变量像另一个变量赋值基本类型的值,会创建这个值得一个副本。

(3)引用类型的值是对象,保存在堆内存中

(4)包含引用类型值得变量并不是对象本身,而是一个指向该对象的指针

(5) 从一个变量赋值引用类型的值,赋值的是指针,因此2个变量都指向同一个对象

越来越感觉javascript对象分配,内存管理和.net中new关键字创建对象有很多相似之处.

  

Javascript手记-垃圾收集的更多相关文章

  1. javascript的垃圾收集机制

    × 目录 [1]原理 [2]标记清除 [3]引用计数[4]性能问题[5]内存管理 前面的话 javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存.在编写javascri ...

  2. 从头开始学JavaScript (十)——垃圾收集

    原文:从头开始学JavaScript (十)--垃圾收集 一.垃圾收集 1.1javascript垃圾收集机制: 自动垃圾收集,执行环境会负责管理代码执行过程中的使用的内存.而在C和C++之类的语言中 ...

  3. Javascript手记-执行环境和作用域

    执行环境是javascript一个重要的概念,执行环境定义了变量有权访问其他数据决定了他们各自的行为,每个执行环境 都有一个与之关联的变量,环境中定义的所有变量和函数都保存在这个对象中,虽然我们编写的 ...

  4. Javascript手记-基本类型和引用类型

    1:ecmascript包含2中不同的数据类型,基本数值类型和引用数值类型.基本数据类型是简单的数据段,引用类型是指那些可能由多个值构成的对象. 1.1:常用的基本类型:Undefined,Null, ...

  5. javaScript手记(01)

    --------------------javaScript基础1.嵌入页面的方式 1.行间事件(主要用于事件): <input type="button" name=&qu ...

  6. JavaScript学习总结——我所理解的JavaScript闭包

    一.闭包(Closure) 1.1.什么是闭包? 理解闭包概念: a.闭包是指有权限访问另一个函数作用域的变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数,也就是创建一个内部函数,创建一 ...

  7. JavaScript作用域链

    之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论都在说了解了作用域链和活动对象才能真正理解闭包,起初不以为然,后来在跟公司同事交流的时 ...

  8. JavaScript 跳坑指南

    JavaScript 跳坑指南 坑0-String replace string的replace方法我们经常用,替换string中的某些字符,语法像这样子 string.replace(subStr/ ...

  9. 个人理解的javascript作用域链与闭包

    闭包引入的前提个人理解是为从外部读取局部变量,正常情况下,这是办不到的.简单的闭包举例如下: function f1(){ n=100; function f2(){ alert(n); } retu ...

随机推荐

  1. React组件测试(模拟组件、函数和事件)

    一.模拟组件 1.用到的工具 (1)browerify (2)jasmine-react-helpers (3)rewireify(依赖注入) (4)命令:browserify - t reactif ...

  2. 未能加载文件或程序集“Interop.jmail”或它的某一个依赖项

    未能加载文件或程序集“Interop.jmail”或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中 ...

  3. Kaleidoscope for mac

    mac下的对比工具Kaleidoscope,是一款不错的对比工具,界面被广大用户所喜爱. window下使用beyond compare 3,具体设置步骤,请见:http://www.cnblogs. ...

  4. hdu 4961 Boring Sum (思维 哈希 扫描)

    题目链接 题意:给你一个数组,让你生成两个新的数组,A要求每个数如果能在它的前面找个最近的一个是它倍数的数,那就变成那个数,否则是自己,C是往后找,输出交叉相乘的和 分析: 这个题这种做法是O(n*s ...

  5. POJ 3233 矩阵乘法

    题意:求解A+A^2+...+A^k 题解: 1)利用通和公式,原式=(A^k+1 - A)(A - O)^-1 时间复杂度O(n^3lgk) 2)递归求解,A+A^2+...+A^k=(A+A^2+ ...

  6. bzoj2241: [SDOI2011]打地鼠

    暴力. O(n^6)暴力卡过,72ms. 莫名其妙做这道题时感觉十分烦躁,难受,只能这样了. O(n^4)的方法是这样差分一下.判断的时候tmp=t[i][j],t[i][j]-=tmp,t[i+r] ...

  7. 终极解决方案:windows10开机黑屏,死机

    windows10开机黑屏,死机一般情况都是由于双显卡中的独立显卡驱动造成的! 那么试着升级一下你的BIOS吧!一定要在官网下载你对应的BIOS驱动,然后双击安装,这个时候就别再动机子了,让他自己刷新 ...

  8. BZOJ2594: [Wc2006]水管局长数据加强版

    题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...

  9. sql server2005内存过高释放方法

    最近做了一个网站qq.115sou.com,在服务器中SQL Server占用内存非常高,加内存后,SQL Server又吃掉新加的内存,好像内存永远不够用一样,怎么办? 其实这并不一定是由于SQL ...

  10. Toast 用于一个页面有多个提示

    private Toast mToast; 2 初始化 mToast = Toast.makeText(this,"",Toast.LENGTH_SHORT); 3 方法 priv ...