gpt4 book ai didi

javascript - 相同的 chrome 对象 ID 是否意味着堆分析器中的对象相同?

转载 作者:行者123 更新时间:2023-11-28 06:54:13 26 4
gpt4 key购买 nike

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

CHrome debuggger

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


a.objectId == b.objectId 意味着 a 与 b 相同
a.objectId == b.objectId 意味着 a 与 b 不同

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

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

This is an object ID. Displaying an object's address makes no sense, as objects are moved during garbage collections. Those object IDs are real IDs — that means, they persist among multiple snapshots taken and are unique. This allows precise comparison between heap states. Maintaining those IDs adds an overhead to GC cycles, but it is only initiated after the first heap snapshot was taken — no overhead if heap profiles aren't used.

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

最佳答案

所以我在 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。

enter image description here

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

关于javascript - 相同的 chrome 对象 ID 是否意味着堆分析器中的对象相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32698594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com