【问题标题】:Why do a blank Ember Object this have a retained size of ~500为什么一个空白的 Ember 对象的保留大小约为 500
【发布时间】:2013-08-13 11:53:52
【问题描述】:

我尝试使用创建 Ember 对象

c = Em.Object.create();

并检查内存转储以查看此内容

它表明 24 的浅层内存和 524 的保留内存。我的问题是,如果我在控制器中保留大约 500 个这样的 Ember 对象,这在内存方面是否值得担心。

假设我有一个控制器,在数组content 中有 500 个 Ember 对象,那么内存转储看起来像这样:

这里数组中的每一项都有 524 的保留大小,因此控制器的保留大小很大,为 268088。这真的是个问题吗?

我怀疑是否所有的 Ember 对象都引用了它们各自引用的相同 524 字节的某些公共对象。

【问题讨论】:

  • 当 emberjs 的开发者做得很好时,所有对象都共享相同的方法(通过原型属性制作),所以至少所有对象都只有对象方法,而不是每个对象他们。就内存消耗而言,始终建议使用原型属性定义方法。然而,每个对象都有自己的值,例如名称或 ID,它们也会为每个对象消耗内存。

标签: javascript memory ember.js google-chrome-devtools


【解决方案1】:

好的,我终于仔细查看了 Ember 源并弄明白了。这是因为they are using delete

(Ember has fixed this now 并且应该不再有空白 ember 对象使用如此剧烈的内存了。

delete 告诉 V8 “我将像使用哈希映射而不是真实对象一样使用这个对象”,因此切换到内部哈希映射结构来存储属性而不是像“C 结构”这样的构造现代 javascript 性能的基础中的核心功能。

当你看灰色的properties时,它表示内部存储占用的空间是一个哈希表,因此占用了大量空间。

我已经创建了一个 jsfiddle:

http://jsfiddle.net/JSbMJ/

您应该运行堆快照并查找对象并查看它们的大小差异有多大(472 与 80):

这绝对不是问题,因为您应该只使用 ember 进行 CRUD,而不是游戏、物理模拟等。

顺便说一句,我不知道其他引擎是否对 delete 有这样的反应,但我想他们会的,因为当你在语义上拥有一个对象并且在许多语言中是不可能的时,这样的操作是没有意义的。

【讨论】:

  • 谢谢你的回复,你说我只应该用 Ember 做 CURD。但是,如果我有一个存储在 webSQL 中的 1000 个对象的集合,我更愿意将它们保存在控制器中,这样我就不必每次都进行 dbrequests 检索。我也在 ios 中使用 cordova 执行此操作,这让我在性能方面进行思考。对于这种情况,您还有其他建议吗?另外,您的答案与表明它们是 GC 期间收集的参考文献大小的其他答案有何关系?
  • @sabithpocker 1000 应用程序的生命周期并不多,即使它们每个占用 0.5kb。但是,当您创建类似的东西时,这些东西确实很重要。每秒 60000 个物体(例如游戏中的粒子爆炸效果,物体越多,看起来就越酷:P)。是的,如果一个空白的 ember 对象得到 GCd,你会得到 524 个字节。
  • 这是一些非常有趣的行为。您对此是否有任何参考,或者这只是 V8 源代码中未记录(或很少记录)的特征?
  • @Qantas94Heavy V8 is mostly undocumented。很难为此在源代码中引用一行,但基本上如果您遵循DeleteProperty function here,您会注意到它最终会在对象上调用NormalizeProperties - 这意味着将优化的属性转换为哈希表格式(或者如果他们已经这样做了,什么也不做)。
  • @sabithpocker 是的 ember 甚至已经修复了它......应该提出一个问题,因为他们似乎关心它
【解决方案2】:

retained size是GC收集对象的那一刻将要释放的内存。

在您的情况下,Ember 对象本身使用 24 个字节,但还拥有内存中的其他对象,这些对象的总大小为 524。当您删除对特定 Ember 对象的所有引用时,它就变成了垃圾,并且所有依赖项它独占的对象将在下一次 GC 时被收集。

如果您控制 500 个 Ember 对象的唯一所有者,则这些对象的保留大小将添加到控制器的保留大小中。

There is a good video about memory on youtube

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多