第168题:WeakMap 和 Map 的区别,WeakMap 原理,为什么能被 GC?
weakmap
是一个额外的数据存储,它可以让我们从外部(第三方库)扩展或者封装一个对象,而不需要进行垃圾回收的推断,或者能够智能的创建一个缓存函数。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
weakmap
是一个额外的数据存储,它可以让我们从外部(第三方库)扩展或者封装一个对象,而不需要进行垃圾回收的推断,或者能够智能的创建一个缓存函数。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
垃圾回收机制
我们知道,程序运行中会有一些垃圾数据不再使用,需要及时释放出去,如果我们没有及时释放,这就是内存泄露
JS 中的垃圾数据都是由垃圾回收(Garbage Collection,缩写为 GC)器自动回收的,不需要手动释放,它是如何做的喃?
很简单,JS 引擎中有一个后台进程称为垃圾回收器,它监视所有对象,观察对象是否可被访问,然后按照固定的时间间隔周期性的删除掉那些不可访问的对象即可
现在各大浏览器通常用采用的垃圾回收有两种方法:
####引用计数
最早最简单的垃圾回收机制,就是给一个占用物理空间的对象附加一个引用计数器,当有其它对象引用这个对象时,这个对象的引用计数加一,反之解除时就减一,当该对象引用计数为 0 时就会被回收。
该方式很简单,但会引起内存泄漏:
这种情况下每次调用
temp
函数,a
和b
的引用计数都是2
,会使这部分内存永远不会被释放,即内存泄漏。现在已经很少使用了,只有低版本的 IE 使用这种方式。####标记清除
V8 中主垃圾回收器就采用标记清除法进行垃圾回收。主要流程如下:
(图片来源:How JavaScript works: memory management + how to handle 4 common memory leaks)
在我们的开发过程中,如果我们想要让垃圾回收器回收某一对象,就将对象的引用直接设置为
null
但如果一个对象被多次引用时,例如作为另一对象的键、值或子元素时,将该对象引用设置为
null
时,该对象是不会被回收的,依然存在如果作为
Map
的键喃?如果想让 a 置为
null
时,该对象被回收,该怎么做喃?WeakMap vs Map
ES6 考虑到了这一点,推出了:
WeakMap
。它对于值的引用都是不计入垃圾回收机制的,所以名字里面才会有一个"Weak",表示这是弱引用(对对象的弱引用是指当该对象应该被GC回收时不会阻止GC的回收行为)。Map
相对于WeakMap
:Map
的键可以是任意类型,WeakMap
只接受对象作为键(null除外),不接受其他类型的值作为键Map
的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键;WeakMap
的键是弱引用,键所指向的对象可以被垃圾回收,此时键是无效的Map
可以被遍历,WeakMap
不能被遍历下面以
WeakMap
为例,看看它是怎么上面问题的:上例并不能看出什么?我们通过
process.memoryUsage
测试一下:执行
node --expose-gc map.js
命令:其中,
--expose-gc
参数表示允许手动执行垃圾回收机制执行
node --expose-gc weakmap.js
命令:上面代码中,只要外部的引用消失,WeakMap 内部的引用,就会自动被垃圾回收清除。由此可见,有了它的帮助,解决内存泄漏就会简单很多。
最后看一下
WeakMap
WeakMap
WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
WeakMap 中,每个键对自己所引用对象的引用都是弱引用,在没有其他引用和该键引用同一对象,这个对象将会被垃圾回收(相应的key则变成无效的),所以,WeakMap 的 key 是不可枚举的。
属性:
方法:
除了
WeakMap
还有WeakSet
都是弱引用,可以被垃圾回收机制回收,可以用来保存DOM节点,不容易造成内存泄漏另外还有 ES12 的
WeakRef
,感兴趣的可以了解下,今晚太晚了,之后更新参考
你不知道的 WeakMap
原文
Map 对象的键可以是任何类型,但 WeakMap 对象中的键只能是对象引用
WeakMap 不能包含无引用的对象,否则会被自动清除出集合(GC)
WeakMap 对象是不可枚举的,无法获取集合的大小
Map 里面的 key 是强引用
weakMap 里面的 key 是是弱引用,不计入 GC 的引用计数中,这意味着在没有其他引用存在时垃圾回收能正确进行
差不多啦, 更多的 GC 原理就不补充了