如何在javascript中使用弱引用?

时间:2017-05-27 18:31:20

标签: javascript node.js

我有一些非常大的对象被集中使用,但偶尔会在我的Node.JS程序中使用。加载这些对象很昂贵。总的来说,它们比我在系统中占用更多的内存。

有没有办法在JavaScript中创建一个“弱引用”,以便垃圾收集器在内存不足时删除我的对象,然后我可以检查该对象是否重新加载它,如果它是垃圾收集的我最后一次访问?

我想到的特定用例是制图重投和平铺千兆字节的地图图像。

1 个答案:

答案 0 :(得分:1)

  

有没有办法在Javascript中创建一个“弱引用”,以便垃圾收集器在内存不足时删除我的对象?

不,Javascript没有。

我认为weakMapweakSet不会在这里为您提供任何有用的信息。他们没有做你想要的。相反,它们允许您引用不会禁止垃圾收集的内容。但是,如果没有其他对数据的引用,那么它将立即被垃圾收集。因此,他们不会像您想要的那样将数据保留一段时间。如果您对这些对象有任何其他引用(为了保持它们),那么它们将永远不会被垃圾收集。 Javascript不提供弱引用,只有当内存开始变满时才会收集垃圾。有些东西要么有资格进行垃圾收集,要么没有。如果它符合条件,它将在下一次GC传递中被释放。

听起来你可能想要的是内存缓存。您可以决定缓存的大小,然后根据某种策略将项目保留在缓存中。最常见的策略是LRU(最近最少使用),当您达到缓存大小限制并且需要在缓存中加载新项目时,将项目从缓存中踢出。使用LRU,您可以跟踪缓存中最后一次使用项目的时间,并将最旧的项目踢出。如果您尝试将缓存管理为内存使用大小,则必须有一些方案来估计缓存中对象的内存使用情况。

请注意,许多数据库本质上都会为您提供此功能作为内置功能,因为它们通常会包含某种类型的缓存,因此如果您从数据库中请求最近请求的项目,则可能来自读取缓存。你没有真正说出你的对象是什么,所以我们很难准确地建议如何从数据库中使用它们。