Wird zunächst der Release-Speicher in PHP deaktiviert?
Schauen wir uns zunächst ein Beispiel an:
var_dump(memory_get_usage()); $a = "laruence"; var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage());
Ausgabe (in Ein Auf verschiedenen PCs kann es aufgrund unterschiedlicher Systeme, PHP-Versionen und geladener Erweiterungen variieren):
int(90440) int(90640) int(90472
Beachten Sie, dass 90472-90440=32, also Es gibt verschiedene Schlussfolgerungen. Einige Leute sagen, dass das Unset von PHP nicht wirklich Speicher freigibt (eine große Anzahl von Strings , und einige Leute sagen sogar, dass es wirklich Speicher freigibt). dass es sinnlos ist, Speicher auf PHP-Ebene zu diskutieren.
Wird also der Speicher durch Unset freigegeben? > Wo sind diese 32 Bytes geblieben?
Zunächst einmal
müssen wir einen Gedanken brechen: PHP ist nicht wie die C-Sprache, nur die von Ihnen angezeigten Aufrufe. Die Speicherzuweisung erfolgt nur bei APIs, die sich auf die Speicherzuweisung beziehen. Mit anderen Worten: In PHP gibt es viele Speicherzuweisungsprozesse, die wir nicht sehen können.
Implizit Die Speicherzuweisungspunkte sind:
$a = "laruence";
und speichern Sie ihn in der Symboltabelle
2. Reservieren Sie Speicher für den Variablenwert Daher können Sie nicht nur auf das Erscheinungsbild
Zweitens schauen,
Zweifeln Sie nicht daran, dass das Unset von PHP tatsächlich Speicher freigibt (natürlich muss es auch mit Referenzen und Zählungen kombiniert werden. Für diesen Teil lesen Sie bitte meinen vorherigen Artikel, um das PHP-Prinzip der Variablentrennung/-referenz im Detail zu verstehen) , aber diese Version ist keine Version im Sinne der C-Programmierung, sie wird nicht an das Betriebssystem zurückgegeben.
Für PHP stellt es eine Reihe von Speicherverwaltungs-APIs bereit, die der C-Sprache für die Speicherzuweisung ähneln Ähnlich wie bei der C-API wird der Speicher in PHP über diese APIs verwaltet. Wenn wir emalloc aufrufen, um Speicher zu beantragen, fragt PHP nicht einfach nach Speicher, sondern fragt das Betriebssystem nach einem großer Block. Weisen Sie dann dem Antragsteller einen Teil davon zu, sodass bei der Beantragung von Speicher keine Notwendigkeit besteht, Speicher vom Betriebssystem zu beantragen, wodurch häufige Systemaufrufe vermieden werden Zum Beispiel wie folgt Beispiel:
Ausgabe:
Nach dem Login kopieren
Das heißt, wenn wir die Variable $a in definieren , PHP Es gibt keine Anwendung für neuen Speicher vom System.
int(262144) int(262144) int(262144
Jetzt möchte ich antworten, wo diese sind 32 Bytes gehen. Wie ich gerade sagte, sind viele Speicherzuweisungsprozesse nicht explizit. Sie werden verstehen, nachdem Sie den folgenden Code gelesen haben:
Ausgabe:
Nach dem Login kopieren
90808-90808 = 0, normal, das heißt, diese 32 Bytes werden von der Ausgabefunktion belegt (genau genommen werden sie vom Ausgabeheader belegt) Ein Array, das nur zunimmt, aber niemals abnimmt
string(43) "I am php.cn" int(90808) //赋值前 int(90976) int(90808) //是的, 内存正常释放
Kopieren Sie den Code Der Code lautet wie folgt:
Wir haben 100 Variablen definiert und klicken dann auf „Deaktivieren“, um die Ausgabe anzuzeigen:
var_dump("I am m.sbmmt.com"); var_dump(memory_get_usage()); $array = array_fill(1, 100, "laruence"); foreach ($array as $key => $value) { ${$value . $key} = NULL; } var_dump(memory_get_usage()); foreach ($array as $key=> $value) { unset(${$value . $key}); } var_dump(memory_get_usage());
Wow, warum gibt es so viel weniger Speicher?
string(43) "I am php.cn" int(93560) int(118848) int(104448
Hashtable kann dagegen nur erweitert und nicht reduziert werden. Für das obige Beispiel reichte die Symboltabelle nicht aus, also haben wir eine Erweiterung, und wenn wir diese 100 Variablen nacheinander aufheben, wird der von den Variablen belegte Speicher freigegeben (118848 – 104448), aber die Symboltabelle wurde nicht verkleinert, sodass die kleine Menge an Speicher von der Symboltabelle selbst belegt wird. .
Haben Sie nun ein vorläufiges Verständnis der Speicherverwaltung von PHP?
Das obige ist der detaillierte Inhalt vonWas passiert, wenn unset Speicher in PHP freigibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!