Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist der PHP-Garbage-Collection-Mechanismus?

Was ist der PHP-Garbage-Collection-Mechanismus?

一个新手
一个新手Original
2017-09-13 10:00:201552Durchsuche

 Der ganze Grund für die Implementierung eines Garbage-Collection-Mechanismus besteht darin, Speicherbedarf zu sparen, indem zirkulär referenzierte Variablen bereinigt werden.

  1. Referenzanzahl: PHP-Variablen existieren in einem Variablencontainer namens „zval“. Ein zval-Variablencontainer enthält neben Typ und Wert der Variablen auch zwei Bytes zusätzlicher Informationen: is_ref und refcount. is_ref ist ein Bool-Wert, der verwendet wird, um zu identifizieren, ob diese Variable zu einer Referenzsammlung gehört, sodass die PHP-Engine gewöhnliche Variablen von Referenzvariablen unterscheiden kann; refcount wird verwendet, um die Anzahl der Variablen darzustellen, die auf diesen zval-Variablencontainer verweisen 0 bedeutet, dass die Variablen gelöscht oder recycelt werden können

    <?php
    $a = array( &#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42 );
    $a[&#39;life&#39;] = $a[&#39;meaning&#39;];
    xdebug_debug_zval( &#39;a&#39; );
    ?>

    Die Ausgabe der obigen Routine lautet wie folgt:

    a: (refcount=1, is_ref=0)=array (
       &#39;meaning&#39; => (refcount=2, is_ref=0)=&#39;life&#39;,
       &#39;number&#39; => (refcount=1, is_ref=0)=42,
       &#39;life&#39; => (refcount=2, is_ref=0)=&#39;life&#39;
    )

    Die Ausgabe von : >Die Ergebnisse des obigen Beispiels sind wie folgt:

    <?php
    $a = array( &#39;one&#39; );
    $a[] =& $a;
    xdebug_debug_zval( &#39;a&#39; );
    unset($a);
    xdebug_debug_zval( &#39;a&#39; );
    ?>
    Obwohl es in einem Bereich kein Symbol mehr gibt, das auf diesen Variablencontainer zeigt, ist das Array-Element „ 1" verweist immer noch auf das Array selbst, daher kann dieser Container nicht gelöscht werden. Da kein anderes Symbol darauf verweist, hat der Benutzer keine Möglichkeit, die Struktur zu löschen, was zu einem Speicherverlust führt. PHP löscht diese Datenstruktur am Ende der Skriptausführung, aber bevor PHP sie löscht, verbraucht es viel Speicher

    (refcount=1, is_ref=1)=array (
       0 => (refcount=1, is_ref=0)=&#39;one&#39;,
       1 => (refcount=1, is_ref=1)=...
    )

    Recyclingzyklus: Kann zur Behandlung von Speicherlecks verwendet werden, die durch Zirkelverweise verursacht werden. Wenn der Referenzzähler eines Variablencontainers steigt, wird er weiterhin verwendet und landet natürlich nicht mehr im Müll; wenn der Referenzzähler auf Null sinkt, wird der Variablencontainer gelöscht (frei). Das heißt, ein Garbage-Cycle findet nur dann statt, wenn der Referenzzähler auf einen Wert ungleich Null reduziert wird. Zweitens wird in einem Garbage-Cycle überprüft, ob der Referenzzähler um 1 reduziert (simuliert) wird und welche Variablencontainer überprüft werden Referenzen haben Die Häufigkeit ist Null, um herauszufinden, welcher Teil Müll ist

  2. Schalten Sie den Müllsammelmechanismus ein und aus: In Zusätzlich zum Ändern der Konfiguration

    zend.enable_gc können Sie den Garbage-Collection-Mechanismus auch ein- und ausschalten, indem Sie die Funktionen
  3. gc_enable() bzw.
  4. gc_disable() aufrufen. Darüber hinaus

    Mögliche Wurzeln werden auch dann aufgezeichnet, wenn der Garbage-Collection-Mechanismus nicht verfügbar ist, sodass nicht jedes Mal, wenn ein möglicher Root gefunden wird, überprüft werden muss, ob der Garbage-Collection-Mechanismus aktiviert ist, und der Aufzeichnungsvorgang schneller ist . Der Aufruf der Funktion gc_collect_cycles() kann das Recycling von Zyklen erzwingen.

Das obige ist der detaillierte Inhalt vonWas ist der PHP-Garbage-Collection-Mechanismus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn