Anleitung zur Umsetzung
1. Fügen Sie dem Objekt einen Referenzzähler hinzu. Der Wert des Referenzzählers erhöht sich jedes Mal irgendwo. Immer wenn eine Referenz ungültig wird, wird der Zähler um eins dekrementiert.
Wenn der Refcount des Variablenwerts um eins reduziert wird und gleich 0 ist, wird der Wert freigegeben und ist kein Müll. Der Garbage Collector kümmert sich nicht darum.
Wenn der Refcount des Variablenwerts nach der Reduzierung um eins größer als 0 ist, gilt der Wert als nicht freigebbar und kann zu Müll werden.
2. Der Garbage Collector sammelt möglichen Müll ab, startet das Müllerkennungsprogramm und gibt den echten Müll frei.
Beispiel
<?php // Fall des PHP-Garbage-Collection-Mechanismus: Weitere Informationen finden Sie im PHP-Handbuch //------Skalartyp------ // Tipp: Jede PHP-Variable existiert in einem Variablencontainer namens „zval“, der den Typ und Wert der Variablen enthält, „is_ref“: ob es sich um eine Referenzvariable handelt, „refcount“: Referenzanzahl // ex: Einen neuen Zval-Container generieren $a = 'new string'; // ex: zval-Containerinformationen anzeigen xdebug_debug_zval('a'); // a: (refcount=1, is_ref=0),string 'new string' (length=10) // ex: Erhöhen Sie den Referenzzähler des Zval-Containers $c = $b = $a; xdebug_debug_zval('a'); // a:(refcount=3, is_ref=0),string 'new string' (length=10) xdebug_debug_zval('b'); // b:(refcount=3, is_ref=0),string 'new string' (length=10) xdebug_debug_zval('c'); // c:(refcount=3, is_ref=0),string 'new string' (length=10) // Tipp: Derzeit gibt es nur einen Container, da PHP den generierten Variablencontainer nicht kopiert, wenn dies nicht erforderlich ist. // Zu diesem Zeitpunkt ist dieser Variablencontainer mit der Variablen a, der Variablen b und der Variablen c verknüpft. unset($b); // ex: Referenzanzahl reduzieren xdebug_debug_zval('a'); // a:(refcount=2, is_ref=0),string 'new string' (length=10) // Tipp: unset Beim Löschen einer Variablen wird die Anzahl der Refcount-Variablen um eins verringert. Zu diesem Zeitpunkt verweisen nur $a und $b auf den Variablencontainer. unset($a); unset($c); var_dump($a); // Tipp: Zu diesem Zeitpunkt ist Recount 0 und die Variable wird gelöscht. // Wenn Recount 0 wird, wird der Variablencontainer mit Typ und Wert aus dem Speicher gelöscht. //------Zusammengesetzter Typ------------- echo '--------------Zusammengesetzter Typ------------<br/>'; $a = array( 'Name' => 'Junior', 'Alter' => 18 ); xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0), // Array (Größe=2) // 'name' => (refcount=1, is_ref=0),string 'junior' (length=6) // 'age' => (refcount=1, is_ref=0),int 18 // Beispiel: Ein vorhandenes Element zum Array hinzufügen $a['love'] = $a['name']; xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0), // Array (Größe=3) // 'name' => (refcount=2, is_ref=0),string 'junior' (length=6) // 'age' => (refcount=1, is_ref=0),int 18 // 'love' => (refcount=2, is_ref=0),string 'junior' (length=6) // $a = array('one'); // xdebug_debug_zval('a'); // // $b = &$a; // $c = $a; // $b = &$c; // xdebug_debug_zval('b'); // xdebug_debug_zval('c'); // xdebug_debug_zval('a'); // Variablencontainerproblem bereinigen echo '------------Speicherverlustproblem-----------<br/>'; $a = array('one'); xdebug_debug_zval('a'); // a:(refcount=1, is_ref=0), // Array (Größe=1) // 0 => (refcount=1, is_ref=0),string 'one' (length=3) $a[] = &$a; xdebug_debug_zval('a'); // a:(refcount=2, is_ref=1), // Array (Größe=2) // 0 => (refcount=1, is_ref=0),string 'one' (length=3) // 1 => (refcount=2, is_ref=1), // &array // unset($a); // (refcount=1, is_ref=1)=array ( // 0 => (refcount=1, is_ref=0)='one', // 1 => (refcount=1, is_ref=1)=... // ) // Tipp: Nach unset($a) wird der Referenzzähler um eins dekrementiert, obwohl kein Symbol mehr in einem Bereich vorhanden ist, der auf diese Struktur (also den Variablencontainer) zeigt. // Da das Array-Element „1“ immer noch auf das Array selbst zeigt, kann dieser Container nicht gelöscht werden. // Da kein anderes Symbol darauf verweist, hat der Benutzer keine Möglichkeit, diese Struktur zu löschen, was zu einem Speicherverlust führt. // Glücklicherweise , PHP wird diese Datenstruktur am Ende der Skriptausführung löschen, aber es wird viel Speicher verbraucht, bevor PHP sie löscht. // Dasselbe passiert mit Objekten, tatsächlich ist es wahrscheinlicher, dass es mit Objekten passiert, weil auf Objekte immer implizit verwiesen wird.
Das Obige zeigt, wie die PHP-Referenzzählung die Garbage Collection implementiert. Ich hoffe, dass es für alle hilfreich ist.