经常使用 Javascript 的人会琢磨其垃圾收集机制,Javascript 并不像 C,C++ 那样需要开发者手动去清除垃圾,在编写 Javascript 程序是,开发者无需关心内存使用问题,所需内存分配以及无用内存(垃圾)的回收完全实现了自动管理。究其根源,主要是程序收集那些不再使用的变量,并且释放其占用的内存。因此,垃圾收集机制会按照固定时间间隔,周期性反复的执行这一操作。
Javascript 垃圾收集机制
转载mob604756e605af ©著作权
举例来说,局部变量只存在于函数内部,程序会为局部变量在栈内存或堆内存中分配对应的存储空间,当函数运行结束,局部变量所占用的内存就没有存在的必要了,这时程序会释放局部变量所占用的内存供其他变量使用。这是程序最简单释放内存的方法,但是很多时候,程序中变量会一直被使用,此时垃圾收集机制必须跟踪变量并且判断其是否被使用,是否可以释放其内存空间。
垃圾收集机制主要判断变量释放内存空间的方法有两个:其一是标记清除法,其二是引用计数法。
标记法,每个变量都有其运行环境,变量创建后会在某种环境中运行,比如创建一个局部变量,局部变量会运行在函数体内。当函数运行时,会标记局部变量为“进入环境”,当函数体运行结束后,意味着变量脱离了其运行环境,此时则将变量标记为“离开环境”。对于“离开环境”的变量,垃圾收集机制会进行相应记录,并且在下一个回收周期时将其释放。
引用计数法,跟踪记录每个值的被引用次数。声明一个变量并将一个引用类型值赋给该变量时,这个值得引用次数就是 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,在下一个垃圾收集周期时,会被回收并且释放其所占用的内存。
举报文章
请选择举报类型
内容侵权
涉嫌营销
内容抄袭
违法信息
其他
补充说明
0/200
上传截图
格式支持JPEG/PNG/JPG,图片不超过1.9M
相关文章
-
C语言程序设计与数据结构
C语言程序设计与数据结构C语言程序设计与数据结构 笔记C语言程序设计与数据结构 笔记...
c语言程序设计 数据结构 javascript -
127个常用的JS代码片段
JavaScript 是目前最流行的编程语言之一,正如大多数人所说:“如果你想学一门编程语言,请学JavaS
数组 javascript 字符串 -
浏览器可以运行 Python 代码了,Python 也许会变成前后端通吃的语言
你好,我是征哥,作为 Python 程序员,我很羡慕那些 Javascript 开发者,动不动就能写出令人惊艳的网页。不过今年,
c++ python 编程语言 java javascript -
基于SSM的航空订票系统
1、项目简述基于SSM的航空订票系统根据功能设计划分为管理员用户和注册用户,从这两种用户的功能所需展开设计,管理员对注册用户管理
java tomcat ssm eclipse javascript -
实战案例:Zabbix对Linux主机监控
zabbix监控Linux主机
centos linux 分布式系统 zabbix监控Linux主机 -
Python[5]: python爬虫实例项目大全网址搜集
https://www.cnblogs.com/fwl8888/p/9388389.html1、python爬虫实例项目大全它山之石可以攻玉。保存下
Python python爬虫 javascript -
3图
万字长文:手把手教你实现一套高效的IM长连接自适应心跳保活机制
今天,我将通过本篇文章,手把手教大家实现一套可自适应的心跳保活机制,从而能高效稳定地维持诸如IM聊天这类需求的长连接。
长连接 保活 android 即时通讯 im开发 -
盘点各种程序员常用的框架,看看你是否落伍了?
今天是中秋佳节,祝大家中秋快乐,阖家幸福团圆!和陪陪家人~~~
javascript python 架构师
ebcd9d12157c 7 月前
a21f3834a0ec 7 月前