在v8中将WeakMap本身进行GC编辑时,值会发生什么

阿纳托利树脂

当键的生命周期短于Map自身的生命周期时,WeakMap很有用。但是,我可以想象这样一种情况,即地图的生命周期和键的生命周期是完全独立的(即WeakMap本身可以在其中一个键之前被垃圾回收):

var wm = new WeakMap();
var obj = {};
wm.set(obj, someHeavyData); 
wm = null; // obj is still alive. 

在上面的示例obj中仍然有效。但是,someHeavyData由于原始的WeakMap已被垃圾回收,因此我们无法再访问了。因此,也someHeavyData应该进行垃圾收集。不过,我怀疑它不会被GC处理,并且会产生内存泄漏,因为(据我了解)v8中的WeakMaps是通过某种方式(大致)实现的:

class WeakMap {

    constructor() { 
       this.symbol = Symbol(); 
    }

    get(key) { 
       return key[this.symbol]; 
    }

    set(key, value) { 
       key[this.symbol] = value; 
       return this;
    } 
} 

这意味着,如果任何数据曾经存储在某个弱映射的键下,则将其作为强引用存储在键中(这就是为什么键应该是WeakMaps中的对象的原因),并且直到键本身才会被垃圾回收被垃圾收集。

谁能告诉我我错了,并且会被垃圾回收吗?

当我提前知道地图将在其键之前被垃圾收集时,可以告诉我选择Map而不是WeakMap。不幸的是,有很多合理的情况无法事先得知。例如,二维WeakMap:

class WeakMap2D {

   constructor () {
      this.wm1 = new WeakMap();
   }

   get(key1, key2) {
      var vm2 = this.vm1.get(key1);
      return vm2 && vm2.get(key2);
   }

   set(key1, key2, value) {
      var vm2 = this.vm1.get(key1);
      if (!vm2) {
         vm2 = new WeakMap();
         this.vm1.set(key1, vm2);
      }
      vm2.set(key2, value);
      return this;
   }

} 

使用此类,我们可以编写:

var secrets = new WeakMap2D();
var alice = {}, bob = {};
secrets.set(alice, bob, HugeSecretData);
alice = null;

出于此目的,我们希望HugeSecretData应尽快bobalice由GC进行GC处理。而且看起来只有当第二个键(即bob)被垃圾回收时,它才会被GC处理

再说一次:任何人,请告诉我我错了,并说明如何以及何时垃圾收集这些数据。

洛伊克·福尔·拉克鲁瓦

应该回答你的问题:

var obj = {}
var weakmap = null;

while(true) {
  weakmap = new WeakMap()
  weakmap.set(obj, new Uint32Array(2048))
}

如您所见,obj永远不会被释放,而是weakmap被更改为新weakmap的,而旧的应该被释放。如果我在中运行NodeJS它,它将释放内存,并且这个无限循环最终不会占用所有内存。就是说,WeakMap它正在按预期工作,并且没有内存泄漏。您认为key继续引用的假设value是错误的,因为在这种情况下,那WeakMap将不是真实的WeakMap

需要花费几秒钟的时间来填补您的记忆Uint32Array(2048)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在“ vi”编辑器中进行编辑时inode值会发生变化?

来自分类Dev

将左值传递给T &&时,会发生什么?

来自分类Dev

What happens with values when WeakMap itself is GC-ed in v8

来自分类Dev

删除后指针本身会发生什么?

来自分类Dev

将限定符添加到布局或值时,会发生什么情况?

来自分类Dev

当在C ++中将此双精度值乘以2时,为什么会发生计算错误?

来自分类Dev

使用std :: remove()从向量中删除多个值时,为什么会发生跳过?

来自分类Dev

将值存储在VARCHAR中(超出SQL的限制)会发生什么情况?

来自分类Dev

将硬盘中的所有位都设置为1时会发生什么?

来自分类Dev

将堆栈分配的值装箱后会发生什么?

来自分类Dev

当枚举具有重复值时,如果将int值强制转换为枚举会发生什么?

来自分类Dev

Java:在创建时将值传递给对象时,应该被初始化的成员会发生什么情况?

来自分类Dev

将终端设置为原始模式时出现意外的缩进行为-为什么会发生这种情况?

来自分类Dev

从字典中删除值(对象)时会发生什么?

来自分类Dev

PriorityQueue(Java)中的非最小值会发生什么?

来自分类Dev

如果我们将彼得森算法中的命令重新排序以进行互斥会发生什么?

来自分类Dev

如果线程本身调用join()会发生什么

来自分类Dev

如果线程本身调用join()会发生什么

来自分类Dev

在 TiKV 中 raft-log-gc-size-limit 大于 region-split-size 会发生什么

来自分类Dev

当我将其写入文件时,为什么3D numpy数组中的值会发生变化?

来自分类Dev

在python中,当我们为变量分配新值时,旧变量会发生什么?

来自分类Dev

当我将其写入文件时,为什么3D numpy数组中的值会发生变化?

来自分类Dev

在C中,当我们将int强制转换为struct *时,内存中会发生什么?

来自分类Dev

在c ++中将字符串值分配给整数变量时会发生什么?

来自分类Dev

在Java中将字节转换为String时,会发生什么情况?

来自分类Dev

在 r 中将列从因子更改为整数时,值会发生变化

来自分类Dev

堆栈中的代码本身会发生变化

来自分类Dev

Java删除,编辑和更改文件夹中的文件时会发生什么?

来自分类Dev

当我在Amazon S3中将Quiet设置为true以便在deleteObjects()方法中启用安静模式时会发生什么情况?

Related 相关文章

  1. 1

    为什么在“ vi”编辑器中进行编辑时inode值会发生变化?

  2. 2

    将左值传递给T &&时,会发生什么?

  3. 3

    What happens with values when WeakMap itself is GC-ed in v8

  4. 4

    删除后指针本身会发生什么?

  5. 5

    将限定符添加到布局或值时,会发生什么情况?

  6. 6

    当在C ++中将此双精度值乘以2时,为什么会发生计算错误?

  7. 7

    使用std :: remove()从向量中删除多个值时,为什么会发生跳过?

  8. 8

    将值存储在VARCHAR中(超出SQL的限制)会发生什么情况?

  9. 9

    将硬盘中的所有位都设置为1时会发生什么?

  10. 10

    将堆栈分配的值装箱后会发生什么?

  11. 11

    当枚举具有重复值时,如果将int值强制转换为枚举会发生什么?

  12. 12

    Java:在创建时将值传递给对象时,应该被初始化的成员会发生什么情况?

  13. 13

    将终端设置为原始模式时出现意外的缩进行为-为什么会发生这种情况?

  14. 14

    从字典中删除值(对象)时会发生什么?

  15. 15

    PriorityQueue(Java)中的非最小值会发生什么?

  16. 16

    如果我们将彼得森算法中的命令重新排序以进行互斥会发生什么?

  17. 17

    如果线程本身调用join()会发生什么

  18. 18

    如果线程本身调用join()会发生什么

  19. 19

    在 TiKV 中 raft-log-gc-size-limit 大于 region-split-size 会发生什么

  20. 20

    当我将其写入文件时,为什么3D numpy数组中的值会发生变化?

  21. 21

    在python中,当我们为变量分配新值时,旧变量会发生什么?

  22. 22

    当我将其写入文件时,为什么3D numpy数组中的值会发生变化?

  23. 23

    在C中,当我们将int强制转换为struct *时,内存中会发生什么?

  24. 24

    在c ++中将字符串值分配给整数变量时会发生什么?

  25. 25

    在Java中将字节转换为String时,会发生什么情况?

  26. 26

    在 r 中将列从因子更改为整数时,值会发生变化

  27. 27

    堆栈中的代码本身会发生变化

  28. 28

    Java删除,编辑和更改文件夹中的文件时会发生什么?

  29. 29

    当我在Amazon S3中将Quiet设置为true以便在deleteObjects()方法中启用安静模式时会发生什么情况?

热门标签

归档