Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么空白余烬对象的保留大小为~500_Javascript_Memory_Ember.js_Google Chrome Devtools - Fatal编程技术网

Javascript 为什么空白余烬对象的保留大小为~500

Javascript 为什么空白余烬对象的保留大小为~500,javascript,memory,ember.js,google-chrome-devtools,Javascript,Memory,Ember.js,Google Chrome Devtools,我尝试使用创建一个余烬对象 c = Em.Object.create(); 并检查了内存转储以查看此信息 它显示出24岁的浅记忆和524岁的保留记忆。我的问题是,如果我在一个控制器中保留大约500个这样的余烬对象,那么在内存方面,这是否值得担心 假设我有一个控制器,在数组content中有500个余烬对象,那么momory转储如下所示: 这里,数组中的每个项都有524个保留大小,因此控制器的保留大小很大,为268088。这真的是个问题吗 我怀疑所有余烬对象是否都引用了它们各自引用的某个公共

我尝试使用创建一个余烬对象

c = Em.Object.create();
并检查了内存转储以查看此信息

它显示出24岁的浅记忆和524岁的保留记忆。我的问题是,如果我在一个控制器中保留大约500个这样的余烬对象,那么在内存方面,这是否值得担心

假设我有一个控制器,在数组
content
中有500个余烬对象,那么momory转储如下所示:

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


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

保留的大小是GC收集对象时将释放的内存

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

如果控制器是500个余烬对象的唯一所有者,则这些对象的保留大小将添加到控制器的保留大小


好的,我终于仔细查看了余烬的来源并找到了答案。因为

(余烬,空白的余烬对象不再有如此大的内存使用)。

<代码>删除< /代码>告诉V8,“我将像哈希映射那样使用这个对象而不是实际对象”,因此切换到一个内部散列映射结构来存储一个属性而不是“C结构”,这是构建现代JavaScript性能的核心特征。 当您查看灰色的

属性
时,它表示内部存储器占用的空间,它是一个哈希表,因此占用了大量空间

我创建了一个JSFIDLE:

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

这绝对不是一个问题,因为你应该只做余烬积垢,而不是游戏,物理模拟或诸如此类


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

当emberjs的开发人员做得很好时,所有对象都共享相同的方法(通过prototype属性生成),因此,至少所有对象都只有对象方法,而不是每个对象。在内存消耗方面,始终建议使用prototype属性定义方法。不过,每个对象都有自己的值,例如名称或id,这些值也会消耗每个对象的内存。感谢您的回复,您说我在上我应该用余烬做凝乳。但是如果我在webSQL中存储了1000个对象的集合,我更喜欢将它们保存在一个控制器中,这样我就不必每次都发出dbrequests进行检索。此外,我在ios中使用cordova做这件事,这让我从性能角度考虑。对于这种情况,你还有其他建议吗?还有,我是怎么做的你的答案与另一个答案有什么关系,这表明它们是GC期间收集的引用的大小?@sabithpocker 1000对于应用程序的生命周期来说,即使它们每个占用0.5kb,也不会太大。不过,当你每秒创建60000个对象时,这些东西确实很重要(例如,游戏中的粒子爆炸效果,对象越多,看起来就越酷:P)。是的,如果一个空白的余烬对象获得GCd,你会得到524字节。这是一个非常有趣的行为。你对此有任何参考资料吗,或者这只是没有记录的(或者很少有记录)V8源代码中的特征?@Qantas94Heavy。很难在源代码中引用一行内容,但基本上,如果您遵循,您会注意到它最终会调用对象-这意味着将优化的属性转换为哈希表格式(或者如果它们已经这样做了,则不做任何事情).@sabithpocker yes ember甚至已经修复了它……他们似乎很关心它,所以应该对它进行处理