Javascript 相同的chrome对象ID是否意味着堆探查器中存在相同的对象?
我正在使用我们的一个网络应用解决内存问题。我正在使用Chrome的堆分析器。我想确保我非常明确地理解了一些东西,因为我正在对这些信息进行假设 上面堆配置文件屏幕截图中的Javascript 相同的chrome对象ID是否意味着堆探查器中存在相同的对象?,javascript,google-chrome,profiling,heap,heap-profiling,Javascript,Google Chrome,Profiling,Heap,Heap Profiling,我正在使用我们的一个网络应用解决内存问题。我正在使用Chrome的堆分析器。我想确保我非常明确地理解了一些东西,因为我正在对这些信息进行假设 上面堆配置文件屏幕截图中的@符号。我想确保我完全明白:相等的对象ID意味着相同的对象 a、 objectId==b。objectId表示与b相同的 a、 objectId==b.objectId表示与b不相同 因此,如果我有两个我期望实际上是同一事物的对象,但它们的对象id不同,这意味着发生了意外的复制?这意味着我可以在我的代码中找出我可能在哪里创建
@
符号。我想确保我完全明白:相等的对象ID意味着相同的对象
a、 objectId==b。objectId表示与b相同的
a、 objectId==b.objectId表示与b不相同
因此,如果我有两个我期望实际上是同一事物的对象,但它们的对象id不同,这意味着发生了意外的复制?这意味着我可以在我的代码中找出我可能在哪里创建不必要的重复
似乎是这样说的,但他们没有明确地说出来,接着说为什么他们有一个对象id,而不是它代表什么
这是一个对象ID。显示对象的地址毫无意义,因为对象在垃圾收集期间会移动。这些对象ID是真实的ID——也就是说,它们在拍摄的多个快照中保持不变,并且是唯一的。这允许在堆状态之间进行精确比较。维护这些ID会增加GC周期的开销,但只有在第一个堆快照拍摄完成后才会启动—如果不使用堆配置文件,则不会增加开销
我明白了。但是我需要把它重新放回我的C程序员的头脑中。我意识到,即使使用本机堆,指针值也会随时间而变化。我能有效地将对象id视为随着时间推移而唯一的指针地址吗?因此我在Chrome中运行了一些测试代码,答案似乎是肯定的,相同的对象id意味着相同的对象。如果对象id不同,则表示一个副本或不同的对象 我分析了以下代码片段,可以在下面的示例中找到: 堆探查器确认两个引用共享对象id,副本接收新的对象id
简言之,这和我预期的一样。对同一对象的多个引用接收相同的对象id。副本引用不同的对象并接收不同的对象id。因此我在Chrome中运行了一些测试代码,答案似乎是肯定的,相同的对象id意味着相同的对象。如果对象id不同,则表示一个副本或不同的对象 我分析了以下代码片段,可以在下面的示例中找到: 堆探查器确认两个引用共享对象id,副本接收新的对象id 简言之,这和我预期的一样。对同一对象的多个引用接收相同的对象id。副本引用不同的对象并接收不同的对象id
(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);