Одинаковые идентификаторы объектов Chrome подразумевают один и тот же объект в профилировщике кучи?
Я работаю над проблемой памяти в одном из наших веб-приложений. Я использую Chrome профилировщик кучи. Я хочу удостовериться, что понимаю что-то очень четко, поскольку я делаю предположения относительно этой информации.
@
символ на скриншоте профиля кучи выше. Я хочу убедиться, что я понимаю кристально ясно: одинаковые идентификаторы объектов подразумевают один и тот же объект
a.objectId == b.objectId implies a same as b
a.objectId == b.objectId implies NOT a same as b
Поэтому, если у меня есть два объекта, которые, как я ожидал, фактически будут одним и тем же, но их идентификатор объекта отличается, это означает, что произошла неожиданная копия? Это означает, что я могу пойти и выяснить в своем коде, где я могу создавать ненужные дубликаты?
Документация, кажется, говорит это, но они не совсем говорят это явно, продолжая говорить, почему у них есть идентификатор объекта, а не то, что он представляет.
Это идентификатор объекта. Отображение адреса объекта не имеет смысла, так как объекты перемещаются во время сборщиков мусора. Эти идентификаторы объектов являются реальными идентификаторами - это означает, что они сохраняются среди нескольких снятых снимков и являются уникальными. Это позволяет точное сравнение между состояниями кучи. Поддержание этих идентификаторов добавляет издержки к циклам GC, но оно инициируется только после того, как был сделан первый снимок кучи - никаких накладных расходов, если профили кучи не используются.
Я понимаю. Но мне нужно вставить это обратно в голову программиста на Си. Я понимаю, что даже с собственными кучами значения указателей могут меняться со временем. Могу ли я эффективно рассматривать идентификаторы объектов как адреса указателей, уникальные с течением времени?
1 ответ
Итак, я запустил некоторый тестовый код в Chrome, и ответ, кажется, да, один и тот же идентификатор объекта подразумевает идентичные объекты. Если идентификатор объекта отличается, это подразумевает копию или другой объект в целом.
Я профилировал следующий фрагмент кода, который можно найти в этом репозитории github:
(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);
Профилировщик кучи подтверждает идентификаторы двух общих ссылок, копия получает новый идентификатор объекта.
Короче говоря, это ведет себя так, как я ожидаю. Несколько ссылок на один и тот же объект получают один и тот же идентификатор объекта. Копии ссылаются на другой объект и получают другой идентификатор объекта.