Einführung in den Garbage-Collection-Mechanismus der zugrunde liegenden Prinzipien von PHP (Codebeispiel)

不言
Freigeben: 2023-04-05 13:58:02
nach vorne
2619 Leute haben es durchsucht

Dieser Artikel bietet Ihnen eine Einführung in den Garbage-Collection-Mechanismus (Codebeispiele) der zugrunde liegenden Prinzipien von PHP. Ich hoffe, dass er für Sie hilfreich ist .

Der PHP-Garbage-Collection-Mechanismus ist ein vertrauter, aber nicht sehr vertrauter Inhalt für PHPer. Wie recycelt PHP also unnötigen Speicher?

Die interne Speicherstruktur von PHP-Variablen

Zunächst müssen Sie die Grundkenntnisse verstehen, um das Verständnis der Prinzipien der Garbage Collection zu erleichtern. Jeder weiß, dass PHP in C geschrieben ist, daher hängt die interne Speicherstruktur von PHP-Variablen auch mit der C-Sprache zusammen, dh der Struktur von zval:

struct _zval_struct {
    union {
        long lval;
        double dval;
        struct {
            char *val;
            int len;
        } str;
        HashTable *ht;
        zend_object_value obj;
        zend_ast *ast;
    } value;                    //变量value值
    zend_uint refcount__gc;   //引用计数内存中使用次数,为0删除该变量
    zend_uchar type;           //变量类型
    zend_uchar is_ref__gc;    //区分是否是引用变量
};
Nach dem Login kopieren

Aus dem Inhalt der obigen Struktur haben wir Sie können sehen, dass jede PHP-Variable aus vier Teilen besteht: Variablentyp, Wert, Referenzanzahl und ob es sich um eine Referenzvariable handelt.

Hinweis: Die obige ZVAL-Struktur ist die Struktur nach PHP5.3. 3, der Garbage-Collection-Mechanismus ist GC, daher gibt es kein _gc im Namen; nach der PHP7-Version wurde die ZVAL-Struktur aufgrund von Leistungsproblemen neu geschrieben wird hier nicht mehr angegeben

Verstehen der PHP-Variablen Nach der internen Speicherstruktur lernen wir die Prinzipien im Zusammenhang mit der PHP-Variablenzuweisung und dem frühen Garbage-Collection-Mechanismus kennen

Variablencontainer

Nicht-Array- und Objektvariablen

Jede Konstante Beim Zuweisen eines Werts zu einer Variablen wird ein Variablencontainer

generiert. Beispiel:

$a = '许铮的技术成长之路';
xdebug_debug_zval('a')
Nach dem Login kopieren

Ergebnis:

a: (refcount=1, is_ref=0)='许铮的技术成长之路'
Nach dem Login kopieren

Array- und Objektvariablen

generieren die Anzahl der Elemente +1 Variablencontainer

Beispiel:

$b = [
'name' => '许铮的技术成长之路',
'number' => 3
];
xdebug_debug_zval('b')
Nach dem Login kopieren

Ergebnis:

b: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3)
Nach dem Login kopieren

Prinzip der Zuweisung (Copy-on-Write-Technologie)

Nachdem wir die konstante Zuweisung verstanden haben, fahren wir fort. Denken wir über die Zuweisung zwischen Variablen aus der Perspektive des Speichers nach

Beispiel:

$a = [
'name' => '许铮的技术成长之路',
'number' => 3
]; //创建一个变量容器,变量a指向给变量容器,a的ref_count为1
$b = $a; //变量b也指向变量a指向的变量容器,a和b的ref_count为2
xdebug_debug_zval('a', 'b');
$b['name'] = '许铮的技术成长之路1';//变量b的其中一个元素发生改变,此时会复制出一个新的变量容器,变量b重新指向新的变量容器,a和b的ref_count变成1
xdebug_debug_zval('a', 'b');
Nach dem Login kopieren

Ergebnis :

a: (refcount=2, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3)
b: (refcount=2, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3)
a: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3)
b: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路1', 'number' => (refcount=1, is_ref=0)=3)
Nach dem Login kopieren

Wenn also Variable a der Variablen b zugewiesen wird, gibt es keine sofortige Generierung eines neuen Variablencontainers, sondern verweist die Variable b auf den Variablencontainer, auf den die Variable a zeigt, d. ; und wenn sich ein Element der Variablen b ändert, erfolgt tatsächlich eine Kopie des Variablencontainers, d Auf 0 gelöscht bedeutet dies, dass der Variablencontainer zerstört wird und das Speicherrecycling erreicht wird Durch Zirkelverweis verursachtes Leck

Vor PHP5.3 gibt es jedoch eine Lücke im Garbage-Collection-Mechanismus, d Wenn zu diesem Zeitpunkt gelöscht wird, wird dieser Variablencontainer nicht gelöscht, da seine untergeordneten Elemente immer noch auf den Variablencontainer verweisen. Da jedoch kein Symbol vorhanden ist, das auf den Variablencontainer zeigt, kann es nicht gelöscht werden, sodass bis zur Ausführung ein Speicherverlust auftritt des Skripts endet 写时复制技术

Beispiel:

$a = "许铮的技术成长之路";
$b = $a;
xdebug_debug_zval('a');
unset($b);
xdebug_debug_zval('a');
Nach dem Login kopieren

Da die Ausgabe dieses Beispiels nicht gut ist, verwenden Sie das Diagramm, um es darzustellen:

php5.3版本之前的垃圾回收机制

Beispiel:

a: (refcount=2, is_ref=0)='许铮的技术成长之路'
a: (refcount=1, is_ref=0)='许铮的技术成长之路'
Nach dem Login kopieren

Wie im Bild gezeigt:

Neuer Müllsammelmechanismus

Der Root-Puffer-Mechanismus wurde nach Version php5.3 eingeführt. Das heißt, wenn PHP startet, wird standardmäßig ein Root-Puffer mit einer angegebenen Anzahl von Zvals verwendet (der Standardwert ist 10000, wenn PHP feststellt, dass es Zvals mit Zirkel gibt). Referenzen: Wenn der Root-Puffer die in der Konfigurationsdatei angegebene Anzahl erreicht (der Standardwert ist 10000), wird eine Speicherbereinigung durchgeführt, um das durch Zirkelverweise verursachte Speicherleckproblem zu lösen

Einführung in den Garbage-Collection-Mechanismus der zugrunde liegenden Prinzipien von PHP (Codebeispiel)Kriterien für die Bestätigung als Müll

1. Wenn der Referenzzähler auf Null reduziert wird, wird der Variablencontainer gelöscht (frei) und ist kein Müll

2 Wenn der Referenzzähler eines zval reduziert wird und immer noch größer als 0 ist, dann gelangt in den Müllkreislauf. Zweitens können Sie während eines Garbage-Zyklus herausfinden, welche Teile Garbage sind, indem Sie prüfen, ob die Referenzanzahl um 1 reduziert wird und welche Variablencontainer keine Referenzen haben.


Zusammenfassung

Garbage-Collection-Mechanismus: Einführung in den Garbage-Collection-Mechanismus der zugrunde liegenden Prinzipien von PHP (Codebeispiel)1. Basierend auf dem Referenzzählmechanismus von PHP (nur dieser Mechanismus war vor PHP5.3 verfügbar)

2 Wenn PHP gleichzeitig feststellt, dass ein ZVAL mit einem Zirkelverweis vorhanden ist, wird dieser in den Root-Puffer gelegt. Wenn der Root-Puffer die angegebene Anzahl in der Konfigurationsdatei erreicht, wird eine Speicherbereinigung durchgeführt, um den verursachten Speicherverlust zu beheben durch Zirkelverweise. Problem (php5.3 hat mit der Einführung dieses Mechanismus begonnen)

Das obige ist der detaillierte Inhalt vonEinführung in den Garbage-Collection-Mechanismus der zugrunde liegenden Prinzipien von PHP (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:segmentfault.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage