2016-12-13 4 views
0

Im folgenden Code bleibt aObj nach Garbage Collection im Speicher? Und wie kann ich das am einfachsten testen und sehen?Javascript Garbage Collection

var a = function(arg) { 
    this.argument = arg;  
} 

var aObj = new a({ prop1: 1, prop2: 2 });  
var b = aObj.argument;  
aObj = null; 

Antwort

2

Nein, tut es nicht. Nach der Zeile aObj = null gibt es keine verbleibenden Verweise auf das Objekt, das es enthielt. Es hat einen Verweis auf argument, aber argument hat keinen Verweis auf es, und nachdem Sie die einzige Referenz auf das Objekt (in aObj) freigegeben haben, ist das Objekt für Garbage Collection geeignet.

Lassen Sie uns die Welt nur stoppen vor der aObj = null Linie und sehen, was im Speicher ist (einige Details Weglassen):

 
      +−−−−−−−−−−−−−−−+ 
a−−−−−−−−>| (function) | 
      +−−−−−−−−−−−−−−−+ 
      | (...)   |  +−−−−−−−−−−+ 
      | prototype  |−−−−+−−>| (object) | 
      +−−−−−−−−−−−−−−−+ | +−−−−−−−−−−+ 
           | | (...) | 
           | +−−−−−−−−−−+ 
           | 
      +−−−−−−−−−−−−−−−+ | 
     +−−>| (object) | | 
     | +−−−−−−−−−−−−−−−+ | 
     | | [[Prototype]] |−−−−+ +−−−−−−−−−−+ 
     | | argument  |−−−−+−−>| (object) | 
     | +−−−−−−−−−−−−−−−+ | +−−−−−−−−−−+ 
     |      | | prop1: 1 | 
aObj−−+      | | prop2: 2 | 
           | +−−−−−−−−−−+ 
b−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 

Jetzt können wir tun, um die aObj = null Linie und erhalten:

 
      +−−−−−−−−−−−−−−−+ 
a−−−−−−−−>| (function) | 
      +−−−−−−−−−−−−−−−+ 
      | (...)   |  +−−−−−−−−−−+ 
      | prototype  |−−−−+−−>| (object) | 
      +−−−−−−−−−−−−−−−+ | +−−−−−−−−−−+ 
           | | (...) | 
           | +−−−−−−−−−−+ 
           | 
      +−−−−−−−−−−−−−−−+ | 
      | (object) | | 
      +−−−−−−−−−−−−−−−+ | 
      | [[Prototype]] |−−−−+ +−−−−−−−−−−+ 
      | argument  |−−−−+−−>| (object) | 
      +−−−−−−−−−−−−−−−+ | +−−−−−−−−−−+ 
           | | prop1: 1 | 
aObj: null      | | prop2: 2 | 
           | +−−−−−−−−−−+ 
b−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 

Wie Sie sehen können, hat nichts mehr einen Verweis auf dieses Objekt.

Und was ist der einfachste Weg, den ich testen und sehen kann?

Chrome hat einen ziemlich fortschrittlichen Speicher-Profiler, der kann unter anderem, zeigen Ihnen die Anzahl der Objekte von einem bestimmten Konstruktor, der immer noch im Speicher befinden. Mehr unter their dev tools site here.