博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript垃圾回收
阅读量:6690 次
发布时间:2019-06-25

本文共 1331 字,大约阅读时间需要 4 分钟。

javascript具有自动垃圾回收机制

在编写JavaScript 程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管理。这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作。

一:标记清除

JavaScript 中最常用的垃圾收集方式是标记清除(mark-and-sweep)。当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行留进入相应的环境,就可能用到他们,而标量离开环境,则将其标记为“离开环境”。

垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。


二:引用计数

另一种不太常见的垃圾收集策略叫做引用计数(reference counting)。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。当这个值的引用次数变成0 时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次再运行时,它就会释放那些引用次数为零的值所占用的内存。

const arr = [1, 2, 3, 4]; console.log('hello world');

上面代码中,数组[1, 2, 3, 4]是一个值,会占用内存。变量arr是仅有的对这个值的引用,因此引用次数为1。尽管后面的代码没有用到arr,它还是会持续占用内存。

如果增加一行代码,解除arr[1, 2, 3, 4]引用,这块内存就可以被垃圾回收机制释放了。

let arr = [1, 2, 3, 4]; console.log('hello world'); arr = null;

上面代码中,arr重置为null,就解除了对[1, 2, 3, 4]的引用,引用次数变成了0,内存就可以释放出来了。于此类似的还有闭包。


总结

JavaScript 是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题。可以对JavaScript 的垃圾收集例程作如下总结。

 1:离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。 “标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再回收其内存。

2:另一种垃圾收集算法是“引用计数”,这种算法的思想是跟踪记录所有值被引用的次数。

转载于:https://www.cnblogs.com/CDtao/p/6903608.html

你可能感兴趣的文章
Delphi2010/XE2下隐藏程序系统任务栏的图标
查看>>
文件编码问题
查看>>
linux虚拟机的scsi设备id与盘符不一致问题的解决
查看>>
高薪源于专注和极致!
查看>>
CSVDE批量导入域用户
查看>>
IT168关于敏捷开发采访
查看>>
SystemCenter2012SP1实践(11)VMM的初步使用
查看>>
企业集群平台架构实现与应用实战(HAproxy+keepalived篇)
查看>>
Gartner:2012年北美MSS市场分析
查看>>
我的运维之路(二)
查看>>
世界級VR素材平台的機遇與挑戰
查看>>
ipsec over gRE 详解1
查看>>
路由器利用loopback接口实现物理冗余链路的IPSEC ***
查看>>
在隧道上运行IS-IS 和is-is验证
查看>>
解决centos4不能使用yum的方法
查看>>
我的2015年小结
查看>>
jmeter3.x以上版本安装插件的方法
查看>>
读《做单--成交的秘密》有感
查看>>
Tomcat JDBC pool源码部析
查看>>
Windows 2003 服务器英文版本安装中文语言包
查看>>