【问题标题】:Do identical chrome object ids imply the same object in the heap profiler?相同的 chrome 对象 ID 是否暗示堆分析器中的相同对象?
【发布时间】:2015-12-18 08:27:17
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: javascript google-chrome profiling heap-memory heap-profiling


    【解决方案1】:

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

    我在github repo 中分析了以下sn-p 代码:

    (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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 2020-07-09
      • 2013-07-15
      • 2019-02-15
      • 2020-04-14
      • 1970-01-01
      相关资源
      最近更新 更多