在垃圾收集期间是否检查持久收集
Will a persistent collection be examined during garbage collection?
我在node.js中有一个非常大的对象集合(数百万),我需要将其保存在内存中用于缓存目的(它们维护在几个全局哈希对象中)。每个散列集合存储大约750k个键。
为了将GC保持在最低限度,我想找到存储这些项的最佳方法。将这些项拆分为数十万个哈希会更好吗?我是不是应该完全不用哈希?是否有办法使它们完全远离堆,这样GC就永远不会检查它们(如果有的话,我该怎么做)?
没有公共API来控制JavaScript的垃圾收集。
但是这些年来GC已经走了很长一段路。现代GC实现会注意到一些对象的寿命很长,并将它们放入一个特殊的"区域",该区域将很少被收集。
这究竟是如何工作的完全取决于实现;每个浏览器都有自己的功能,通常,当新版本发布时,这也会发生变化。
EDIT内存布局和组织是完全无关的。如果不花几周时间阅读实际代码,就很难理解现代gc的细节。所以我现在解释的是一个非常简化的图;实际代码的工作方式会有所不同(有些gc会使用完全不同的技巧来实现相同的目标)。
假设GC对每个对象都有一个计数器,用来计算它在过去看到它的频率。此外,它还有几个列表,其中保存了不同年龄的对象,即计数器超过特定阈值的对象。因此,当计数器达到某个限制时,对象被移动到下一个列表。
每次GC运行时访问第一个列表。第二个列表只在每次第n次GC运行时考虑。
另一种实现可能会将新对象添加到"GC列表"的顶部,并且对于每次GC运行,它只检查N个元素。所以长时间存在的对象会移到列表的下端,过一段时间后,它们就不会每次都被检查了。
这对你来说意味着你不需要做任何事情;GC会发现你的大映射存在了很长时间(对于映射中的所有对象都是如此),过了一段时间,它会开始忽略这个数据结构。
- 使用map来检查是否为真'不起作用
- 检查是否存在使用chrome扩展的javascript库
- 检查是否存在任意控制器/操作
- 检查是否已加载原型
- angularJs检查是否输入
- Phonegap应用程序检查是否启用了推送通知
- 检查是否已设置GET变量
- 检查是否可以在另一个数组中找到所有项
- 如何检查是否存在“;没有到主机的路由”;在流式传输视频的过程中一遍又一遍
- Javascript-检查是否设置了cookie
- AngularJs 检查是否未定义和空的最佳实践
- 如何检查是否启用了 javascript 并将其纳入网页
- 检查是否对任何输入文件进行了更改
- 如何检查是否调整浏览器大小的条件
- 重力表格 - gform_post_render检查是否提交
- 检查是否释放了 HTML 按钮
- 循环遍历单选按钮(20 组,每组 3 个),并检查是否选中了每个组
- Jquery Ajax 和 Json:如何检查是否未定义
- jQuery或Javascript检查是否加载了图像
- Heroku+Backbone.js——如何检查是否在生产或开发中