2013-08-13 3 views
16

ich versucht, ein Ember Objekt erstellenWarum ein leeres Ember Objekt zu tun haben diese eine beibehaltene Größe von ~ 500

c = Em.Object.create(); 

und überprüft das Speicherabbild dieses

enter image description here

Er schlägt vor, um zu sehen, mit eine flache Erinnerung von 24 und bewahrte Erinnerung von 524. Meine Frage ist, ist dies etwas in Bezug auf die Erinnerung, wenn ich etwa 500 solcher Ember-Objekte in einem Controller behalte.

Also lassen Sie uns sagen, ich habe einen Controller mit 500 Ember Objekte im Array content, dann ist die momory Dump sieht wie folgt aus:

enter image description here

Hier wird jedes Element in einem Array hat eine Größe 524 beibehalten, und die Controller hat eine große beibehaltene Größe von 268088 als Ergebnis. Ist das wirklich ein Problem?

Ich bezweifle, wenn alle Ember-Objekte beziehen sich auf die gleichen 524bytes eines gemeinsamen Objekts von jedem von ihnen bezeichnet.

+1

Wenn die Entwickler von emberjs einen guten Job gemacht haben, dann teilen alle Objekte die gleichen Methoden (über das prototype-Attribut), also gibt es zumindest die Objekt-Methoden für alle Objekte, nicht für jede von ihnen. Das Festlegen von Methoden mit dem Attribut prototype wird immer im Hinblick auf den Speicherverbrauch empfohlen. Nichtsdestotrotz hat jedes Objekt seine eigenen Werte wie zum Beispiel Name oder ID, die für jedes Objekt auch Speicher verbraucht. – Blauharley

Antwort

33

Ok, ich habe mir die Ember-Quelle endlich genauer angesehen und herausgefunden. Es ist weil they are using delete.

(Ember has fixed this now und es soll durch die leeren ember Objekte mehr keine so drastische Speichernutzung sein.)

delete sagt V8, dass „Ich werde dieses Objekt wie eine Hash-Karte verwenden, anstatt reales Objekt“ und daher wechselt er zu einer internen Hash-Map-Struktur, um seine Eigenschaften statt in "C struct" wie ein Konstrukt zu speichern, das ein Kernmerkmal der modernen JavaScript-Performance ist.

Wenn Sie sich die graue properties ansehen, bedeutet das den Platzbedarf des internen Speichers, der eine Hash-Tabelle ist und daher sehr viel Platz benötigt.

ich eine jsfiddle erstellt haben:

http://jsfiddle.net/JSbMJ/

Sie sollten einen Heap-Snapshot laufen und für die Objekte und sehen, wie enorm ihrer Größe unterscheiden (472 vs 80):

enter image description here

enter image description here

Es ist absolut kein Problem obwohl, weil Du solltest CRUD nur mit Glut machen, nicht mit Spielen, Physiksimulationen oder Ähnlichem.

Btw, ich weiß nicht, ob andere Motoren eine solche Reaktion auf delete haben, aber ich denke, sie würden, weil eine solche Operation keinen Sinn macht, wenn Sie semantisch ein Objekt haben und in vielen Sprachen unmöglich ist.

+0

Vielen Dank für deine Antwort, du hast gesagt, ich soll CURD nur mit Ember machen. Aber wenn ich eine Sammlung von 1000 Objekten habe, die in webSQL gespeichert sind, bevorzuge ich es, sie in einem Controller zu behalten, so dass ich keine dbrequests jedes Mal für den Abruf machen muss. Auch ich mache das in IOS mit Cordova, die mich in Bezug auf Leistung denken lässt. Haben Sie einen anderen Vorschlag für dieses Szenario? Auch wie bezieht sich Ihre Antwort auf die andere Antwort, die darauf hindeutet, dass sie die Größe der während der GC gesammelten Referenzen sind? – sabithpocker

+1

@sabitpocker 1000 für die Lebensdauer der Anwendung ist nicht so viel, auch wenn sie 0,5kb jeweils nehmen. Dieses Zeug spielt jedoch eine Rolle, wenn Sie etwas wie z. 60000 Objekte pro Sekunde (ein Partikelexplosionseffekt in einem Spiel zum Beispiel, je mehr Objekte, desto cooler wird es aussehen: P). Ja, wenn ein leeres Glutobjekt GCd erhält, erhalten Sie 524 Bytes zurück. – Esailija

+0

Das ist ein äußerst interessantes Verhalten. Haben Sie Referenzen dafür, oder sind dies nur undokumentierte (oder spärliche) Merkmale im V8-Quellcode? –

2

Die beibehaltene Größe ist der Speicher, der in dem Moment freigegeben wird, in dem der GC das Objekt erfasst.

In Ihrem Fall verwendet Ember-Objekt selbst 24 Bytes, besitzt aber auch andere Objekte im Speicher und die Gesamtgröße dieser Objekte ist 524. Wenn Sie alle Verweise auf ein bestimmtes Ember-Objekt entfernen, wird es zu einem Müll und es wird alles abhängige Objekte, die er exklusiv besitzt, werden beim nächsten GC gesammelt.

Wenn der Controller der einzige Besitzer der 500 Ember-Objekte ist, wird die beibehaltene Größe dieser Objekte zur beibehaltenen Größe des Controllers hinzugefügt.

There is a good video about memory on youtube.

Verwandte Themen