16

我尝试使用创建一个 Ember 对象

c = Em.Object.create();

并检查内存转储以查看此信息

在此处输入图像描述

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

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

在此处输入图像描述

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

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

4

2 回答 2

35

好的,我终于仔细查看了 Ember 源并弄清楚了。这是因为他们正在使用delete.

(Ember现在已经修复了这个问题,空白的 ember 对象应该不再使用如此剧烈的内存了。

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

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

我创建了一个jsfiddle:

http://jsfiddle.net/JSbMJ/

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

在此处输入图像描述

在此处输入图像描述

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

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

于 2013-08-18T00:06:31.240 回答
2

保留大小是在 GC 收集对象的那一刻将释放的内存。

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

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

youtube上有一段关于记忆的好视频

于 2013-08-17T13:16:20.237 回答