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

Was passiert, wenn unset Speicher in PHP freigibt?

Jun 24, 2017 am 09:54 AM
php unset 内存 Was ist los 释放

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());
Nach dem Login kopieren

Ausgabe (in Ein Auf verschiedenen PCs kann es aufgrund unterschiedlicher Systeme, PHP-Versionen und geladener Erweiterungen variieren):

int(90440)
int(90640)
int(90472
Nach dem Login kopieren

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";
Nach dem Login kopieren
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:

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
Nach dem Login kopieren
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:

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) //是的, 内存正常释放
Nach dem Login kopieren
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());
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

In diesem Kapitel werden wir die Umgebungsvariablen, die allgemeine Konfiguration, die Datenbankkonfiguration und die E-Mail-Konfiguration in CakePHP verstehen.

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

CakePHP arbeitet mit Datenbank CakePHP arbeitet mit Datenbank Sep 10, 2024 pm 05:25 PM

Das Arbeiten mit der Datenbank in CakePHP ist sehr einfach. In diesem Kapitel werden wir die CRUD-Operationen (Erstellen, Lesen, Aktualisieren, Löschen) verstehen.

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

In diesem Kapitel lernen wir die folgenden Themen im Zusammenhang mit dem Routing kennen.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

See all articles