Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse zur PHP-Speicherfreigabe und Garbage Collection

Analyse zur PHP-Speicherfreigabe und Garbage Collection

不言
不言Original
2018-06-19 17:30:221708Durchsuche

In diesem Artikel erhalten Sie Tipps zum Schreiben von Programmen in PHP sowie zu Problemen im Zusammenhang mit der Speicherfreigabe und der Speicherbereinigung. Interessierte Freunde können daraus lernen.

Referenzzuweisung

$a = 'apple';
$b = &$a;

Im obigen Code weise ich der Variablen a eine Zeichenfolge und dann ein The zu Referenz von wird der Variablen b zugewiesen. Offensichtlich sollte der Speicher, der zu diesem Zeitpunkt zeigt, so aussehen:

$a -> &#39;apple&#39; <- $b

a und b zeigen auf denselben Speicherbereich, wir übergeben var_dump($a, $ b ) erhält string(5) „apple“ string(5) „apple“ , was wir erwartet haben.

Funktion deaktivieren

Angenommen, ich möchte die Zeichenfolge „Apfel“ aus dem Speicher löschen. Folgendes habe ich getan:

unset($a);

Aber durch das erneute Drucken der Informationen der beiden Variablen $a $b habe ich dieses Ergebnis erhalten: Hinweis: Undefinierte Variable: a und string(5) „apple“ . Seltsamerweise verweisen $a und $b beide auf einen Speicherbereich, und $a ist eindeutig freigegeben. Warum ist $b immer noch „Apfel“.

Tatsächlich zerstört unset() einen Variablenzeiger und gibt die in diesem Speicherbereich gespeicherte Zeichenfolge nicht frei, sodass der Speicherzeiger nach Abschluss der Operation einfach wie folgt aussieht:

&#39;apple&#39; <- $b

Wichtige Punkte, die Sie beachten sollten: unset() gibt den Speicher, auf den die Variable zeigt, nicht frei, sondern zerstört nur den Variablenzeiger. Gleichzeitig wird der Referenzzähler dieses Speicherabschnitts um 1 verringert. Wenn der Referenzzähler 0 ist, dh wenn dieser Speicherabschnitt von keiner Variablen referenziert wird, wird die Garbage Collection von PHP ausgelöst.

Direkt recyceln

Was kann man also tun, um den von „Apfel“ belegten Speicher wirklich freizugeben?

Mit der obigen Methode können wir unset($a) und dann unset($b) verwenden, um alle Referenzen im Speicherbereich zu zerstören. Wenn die Referenzanzahl auf 0 reduziert wird, wird sie natürlich von PHP recycelt .

Natürlich gibt es eine direktere Methode:

$a = null;

Durch die direkte Zuweisung von Null wird der Speicherbereich geleert, auf den $a And zeigt Der Referenzzähler wird auf Null zurückgesetzt und der Speicher wird freigegeben.

Die Skriptausführung endet

php ist eine Skriptsprache. Wenn die Skriptausführung endet, wird der gesamte im Skript verwendete Speicher freigegeben.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Über die Analyse der Funktion move_uploaded_file() von PHP

Über var_export, print_r und var_dump in PHP Unterschied beim Debuggen

Das obige ist der detaillierte Inhalt vonAnalyse zur PHP-Speicherfreigabe und Garbage Collection. 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