Heim  >  Artikel  >  Backend-Entwicklung  >  Speicherverwaltung und Garbage Collection von PHP-Skripten

Speicherverwaltung und Garbage Collection von PHP-Skripten

不言
不言Original
2018-05-30 09:57:411557Durchsuche

Dieser Artikel informiert Sie über die Speicherverwaltung und Garbage Collection von PHP-Skripten. Er zeigt Ihnen die Speicherverwaltung und Garbage Collection von PHP-Skripten anhand von Beispielen.

Referenzzuweisung

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

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

$a -> 'apple' <- $b

a und b zeigen auf denselben Speicherbereich (Variablencontainer). Wir erhalten var_dump($a, $b) bis string(5) "apple" string(5) "apple", was wir tun erwartet.


Referenzzählung und unset( )

Angenommen, ich möchte die Zeichenfolge &#39;apple&#39; aus dem Speicher freigeben. Ich habe Folgendes gemacht:

unset($a);

Aber durch erneutes Drucken der Informationen der beiden Variablen $a $b habe ich dieses Ergebnis erhalten: Notice: Undefined variable: a und string(5) "apple" . Es ist seltsam. $a $b zeigt beides auf einen Speicherbereich und gibt eindeutig $a frei. Warum ist $b immer noch &#39;apple&#39;?

Tatsächlich ist es so unset() Dadurch wird ein Variablenzeiger zerstört und der Speicherbereich (Variablencontainer) nicht freigegeben. Nach Abschluss der Operation sieht der Speicherzeiger einfach so aus:

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

Wichtige Punkte, die Sie sich merken sollten: unset() gibt den Speicher (Variablencontainer), auf den die Variable zeigt, nicht frei, sondern zerstört nur den Variablenzeiger. Reduzieren Sie gleichzeitig den Referenzzähler (Ref Count) dieses Speicherabschnitts um 1. Wenn der Referenzzähler 0 ist, das heißt, wenn dieser Speicherabschnitt (Variablencontainer) dies nicht ist Wird von einer beliebigen Variable referenziert, wird die PHP-Garbage-Collection ausgelöst.

Überprüfen Sie es mit Code:

$a = &#39;apple&#39;;
$b = &$a;

$before = memory_get_usage();
unset($a);
$after = memory_get_usage();

var_dump($before - $after);  // 结果为int(0),没有释放
$a = &#39;apple&#39;;
$b = &$a;

$before = memory_get_usage();
unset($a, $b);
$after = memory_get_usage();

var_dump($before - $after);  // 结果为int(24),得到释放

Direkt recyceln

Was sollte also getan werden, um wirklich freizugeben? &#39;apple&#39; Was ist mit der Speicher belegt?

Mit der oben genannten 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;

Direkte Zuweisung null leert den Speicherbereich, auf den $a zeigt, und setzt den Referenzzähler auf Null zurück Speicher wird freigegeben.


Die Skriptausführung endet

php ist eine Skriptsprache. Wenn die Skriptausführung endet, wird der gesamte im Skript verwendete Speicher freigegeben. Ist es also sinnvoll, den Speicher manuell freizugeben? Tatsächlich gibt es schon seit langem eine Antwort auf diese Frage. Ich empfehle jedem, einen Artikel von Brother Bird @laruence aus dem Jahr 2012 zu lesen: Bitte geben Sie Ressourcen manuell frei (Bitte geben Sie Ressourcen manuell frei)

Referenzzuweisung

$a = &#39;apple&#39;;
$b = &$a;

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

$a -> 'apple' <- $b

a und b zeigen auf denselben Speicherbereich (Variablencontainer). Wir erhalten var_dump($a, $b) bis string(5) "apple" string(5) "apple", was wir tun erwartet.


Referenzzählung und unset( )

Angenommen, ich möchte die Zeichenfolge 'apple' aus dem Speicher freigeben. Ich habe Folgendes gemacht:

unset($a);

Aber durch erneutes Drucken der Informationen der beiden Variablen $a $b habe ich dieses Ergebnis erhalten: Notice: Undefined variable: a und string(5) "apple" . Es ist seltsam. $a $b zeigt beides auf einen Speicherbereich und gibt eindeutig $a frei. Warum ist $b immer noch 'apple'?

Tatsächlich ist es so unset() Dadurch wird ein Variablenzeiger zerstört und der Speicherbereich (Variablencontainer) nicht freigegeben. Nach Abschluss der Operation sieht der Speicherzeiger einfach so aus:

'apple' <- $b

Wichtige Punkte, die Sie sich merken sollten: unset() gibt den Speicher (Variablencontainer), auf den die Variable zeigt, nicht frei, sondern zerstört nur den Variablenzeiger. Reduzieren Sie gleichzeitig den Referenzzähler (Ref Count) dieses Speicherabschnitts um 1. Wenn der Referenzzähler 0 ist, das heißt, wenn dieser Speicherabschnitt (Variablencontainer) dies nicht ist Wird von einer beliebigen Variable referenziert, wird die PHP-Garbage-Collection ausgelöst.

Überprüfen Sie es mit Code:

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

$before = memory_get_usage();
unset($a);
$after = memory_get_usage();

var_dump($before - $after);  // 结果为int(0),没有释放
$a = 'apple';
$b = &$a;

$before = memory_get_usage();
unset($a, $b);
$after = memory_get_usage();

var_dump($before - $after);  // 结果为int(24),得到释放

Direkt recyceln

Was sollte also getan werden, um wirklich freizugeben? 'apple' Was ist damit? der Speicher belegt?

Mit der oben genannten 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;

Direkte Zuweisung null leert den Speicherbereich, auf den $a zeigt, und setzt den Referenzzähler auf Null zurück Speicher wird freigegeben.

Das obige ist der detaillierte Inhalt vonSpeicherverwaltung und Garbage Collection von PHP-Skripten. 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