Heim  >  Artikel  >  Backend-Entwicklung  >  Was passiert, wenn unset Speicher in PHP freigibt?

Was passiert, wenn unset Speicher in PHP freigibt?

伊谢尔伦
伊谢尔伦Original
2017-06-24 09:54:181833Durchsuche

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:

1 für
$a = "laruence";
Variablenname

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:

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
Wenn wir efree aufrufen, um Speicher freizugeben, gibt PHP den Speicher in ähnlicher Weise nicht an das Betriebssystem zurück, sondern legt diesen Speicher dort ab Die von ihm verwaltete Liste des freien Speichers ist wahrscheinlicher, ihn in die Speicher-Cache-Liste einzufügen (Postscript, einige Versionen von PHP, wie PHP5.2.4, 5.2.6, 5.2.8). Ich habe überprüft, dass beim Aufruf von get_memory_usage() die verfügbare Speicherblockgröße in der Speicher-Cache-Liste nicht subtrahiert wird, was den Anschein erweckt, dass der Speicher nach dem Deaktivieren unverändert bleibt).

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:

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) //是的, 内存正常释放
Hashtable ist die Kernstruktur von PHP (um Hashtable zu verstehen, können Sie auf meinen vorherigen Artikel zum Verständnis von Arrays in PHP (Durchlaufreihenfolge) verweisen), und Arrays werden auch durch dargestellt it. und die Symboltabelle ist auch ein assoziatives Array für den folgenden Code:



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 www.php.cn");
    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?

Das liegt daran für Hashtable Das heißt, bei der Definition ist es unmöglich, genügend Speicherblöcke auf einmal zuzuweisen, um eine unbekannte Anzahl von Elementen zu speichern. Daher weist PHP HashTable während der Initialisierung nur einen kleinen Teil des Speicherblocks zu und verwendet ihn dann, wenn dies der Fall ist ist nicht genug.
     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!

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