【问题标题】:Heap and Native memory allocation in JavaScript: how managed?JavaScript 中的堆和本机内存分配:如何管理?
【发布时间】:2013-11-15 17:39:53
【问题描述】:

JavaScript 具有堆(垃圾收集)内存和本机(类型化数组、DOM 元素)内存。

问题:两者之间是否存在平衡,如果我想拥有大量类型化数组,它可以工作,但只是减少了堆?

通常的模型是分配内存,使得本地从顶部开始,堆在底部,可以这么说。当需要更多内存时,内存会增加,并且本机和堆再次移动到顶部/底部,中间有额外的内存。或者在两者之间进行权衡的类似方法。

奇怪的问题,我意识到,但我正在编写试图通过类型化数组最小化内存使用的大型程序。

谢谢!

【问题讨论】:

  • 为什么你认为类型化数组不是从堆中分配的?所有这些都是特定于特定浏览器的实现。
  • 参见goo.gl/IAGpQx:新 JavaScript 对象的内存是从专用 JavaScript 堆(或 VM 堆)分配的。这些对象由 V8 的垃圾收集器管理,因此只要有至少有一个强烈的参考。原生对象是不在 JavaScript 堆中的所有其他东西。与堆对象相比,本机对象在其生命周期内不受 V8 垃圾收集器管理,只能使用其 JavaScript 包装器对象从 JavaScript 访问。
  • .. 顺便说一句:我同意实施,我应该在我的原始帖子中说 chrome 是我的兴趣。但尽管如此,我已经看到其他关于本机和堆内存之间差异的参考,所以我认为这适用于其他浏览器。
  • 为什么你认为一个类型化数组是一个“原生对象”而不是从堆中分配而不是垃圾收集? DOM 元素由浏览器管理,而不是由 JS 管理,因此它们是不同的野兽,但它们也被垃圾收集(由浏览器)。我问你这些问题是因为我认为你在做一些错误的假设。

标签: javascript memory memory-management


【解决方案1】:

如果您要尽量减少内存使用量并且您的代码适合类型化数组,那么类型化数组应该比常规数组使用更少的内存。所有这些内存都来自同一个地方,所以你关于堆与本机的问题对我来说真的没有意义。用于类型化数组的内存越多,可用于其他任何使用内存的内存就越少。优化的最佳选择是只使用更少的内存,而不用担心什么样的东西在使用该内存,因为内存就是内存,不管它里面有一个类型化的数组还是一个巨大的字符串。

类型化数组像常规数组一样被垃圾回收。类型化数组更节省内存只是因为它们为数组中的每个元素使用更少的存储空间,而不是因为它们使用不同类型的内存。

【讨论】:

  • 我想我同意。 Paul Irish 有一个 chrome Profiler 实验性扩展,可以让你看到堆与“本机”内存的对比,但它被撤回了一段时间。所以我对差异感兴趣。我知道所有“本机”内存都有一个堆引用,因此正如您所说,可以在收集堆对象时释放。然而,一个令人着迷的例外:GPU。它有自己的类型化数组集合,我不认为它们是 cpu 内存空间的一部分。不幸的是,它的内存存储速度很快,但采样速度很慢。
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2015-09-16
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多