Почему пустой объект Ember Object имеет сохраненный размер ~ 500

Я попытался создать объект Ember с помощью

c = Em.Object.create();

и проверили дамп памяти, чтобы увидеть это

enter image description here

Это предполагает неглубокую память 24 и сохраненную память 524. Мой вопрос в том, что это что-то беспокоит с точки зрения памяти, если я держу около 500 таких объектов Ember в контроллере.

Итак, скажем, у меня есть контроллер с 500 Ember Objects в массиве content, тогда дамп momory выглядит так:

enter image description here

Здесь каждый элемент массива имеет сохраненный размер 524, и в результате контроллер имеет большой сохраненный размер 268088. Это действительно проблема?

Я сомневаюсь, что все объекты Ember относятся к тем же 524 байтам какого-то общего объекта, на который ссылается каждый из них.

Ответы

Ответ 1

Хорошо, я наконец взглянул на источник Ember и понял это. Это потому, что они используют delete.

(Ember исправил это сейчас, и больше не должно быть такого резкого использования памяти пустыми ember-объектами.)

delete сообщает V8, что "я буду использовать этот объект как хэш-карту, а не реальный объект" и, следовательно, переключается на внутреннюю структуру хеш-карты для хранения одного свойства, а не как конструкцию "C struct", основная функция в фундаменте построена на современном javascript исполнении.

Когда вы смотрите на серый properties, это означает пространство, которое занимает внутренняя память, которая является хеш-таблицей и поэтому занимает много места.

Я создал jsfiddle:

http://jsfiddle.net/JSbMJ/

Вы должны запустить снимок кучи и посмотреть объекты и посмотреть, насколько сильно их размеры различаются (472 против 80):

enter image description here

enter image description here

Это абсолютно не проблема, потому что вы только должны делать CRUD с ember, а не с играми, физическими симуляторами или такими.

Btw, я не знаю, реагируют ли другие двигатели на delete, но я полагаю, что это произойдет потому, что такая операция не имеет смысла, когда вы семантически имеете объект и невозможны на многих языках.

Ответ 2

Сохраненный размер - это память, которая будет выпущена в тот момент, когда GC собирает объект.

В вашем случае сам объект Ember использует 24 байта, но также владеет другими объектами в памяти, а общий размер этих объектов равен 524. Когда вы удаляете все ссылки на конкретный объект Ember, он становится мусором, и он со всеми зависимыми объекты, которые он владеет исключительно, будут собраны в следующем GC.

Если ваш контроллер является единственным владельцем объектов 500 Ember, тогда сохраненный размер этих объектов будет добавлен к сохраненному размеру контроллера.

Есть хорошее видео о памяти на youtube.