1

我正在解决我们的一个网络应用程序的内存问题。我正在使用 Chrome 的堆分析器。我想确保我非常明确地理解一些东西,因为我正在对这些信息做出假设。

铬调试器

上面堆配置文件屏幕截图中的@符号。我想确保我理解得一清二楚:相等的对象 ID 意味着相同的对象

a.objectId == b.objectId implies a same as b a.objectId == b.objectId implies NOT a same as b

因此,如果我有两个我期望实际上是同一事物的对象,但它们的对象 ID 不同,这是否意味着发生了意外的副本?这意味着我可以在我的代码中找出我可能会在哪里创建不必要的重复项?

文档似乎是这么说的,但他们并没有明确地说出来,继续说为什么他们有一个对象 id,而不是它代表什么。

这是一个对象 ID。显示对象的地址是没有意义的,因为在垃圾回收期间会移动对象。这些对象 ID 是真实的 ID——这意味着,它们在拍摄的多个快照中持续存在并且是唯一的。这允许在堆状态之间进行精确比较。维护这些 ID 会增加 GC 周期的开销,但它仅在拍摄第一个堆快照后启动——如果不使用堆配置文件则没有开销。

我明白了。但我需要把它重新装回我的 C 程序员头脑中。我意识到,即使使用本机堆,指针值也会随着时间而改变。我可以有效地将对象 ID 视为随时间变化的唯一指针地址吗?

4

1 回答 1

0

所以我在 Chrome 中运行了一些测试代码,答案似乎是肯定的,相同的对象 id 意味着相同的对象。如果对象 id 不同,这意味着一个副本或完全不同的对象。

我分析了以下代码片段,可以在这个github repo中找到:

(function heapTest(doc) {
  'use strict';

  function clone(obj) {
    return JSON.parse(JSON.stringify(obj));
  }

  var b = {'grandchild-key-2': 5};
  var a = {'child-key-1': b};
  doc.child1 = a;
  doc.child1_again = a;

  doc.child1_copy = clone(a);

})(document);

堆分析器确认两个引用共享对象 id,副本收到一个新的对象 id。

在此处输入图像描述

简而言之,这就像我预期的那样。对同一对象的多个引用接收相同的对象 ID。副本引用不同的对象并接收不同的对象 ID。

于 2015-09-22T17:46:21.170 回答