Почему пустой объект 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.