Heim > Backend-Entwicklung > PHP-Tutorial > PHP: Der Garbage Collector mit einfachen Worten erklärt

PHP: Der Garbage Collector mit einfachen Worten erklärt

Linda Hamilton
Freigeben: 2024-11-29 00:46:11
Original
810 Leute haben es durchsucht

Der Garbage Collector (GC) ist das interne Speicherverwaltungssystem in PHP, aber es gibt einige Feinheiten, die es zu verstehen gilt.

? Warum gibt es den GC überhaupt?

Der GC automatisiert die Speicherverwaltung, wodurch der Aufwand entfällt, den Speicher mit manuellen Aufgaben zu verwalten (was mühsam wäre).

Dadurch können sich Entwickler auf ihre Geschäftslogik konzentrieren, ohne sich übermäßig Gedanken über „Nicht genügend Arbeitsspeicher“-Fehler machen zu müssen.

Natürlich ist es keine Zauberei.

? Kurz gesagt: 10.000 Objekte

Das Freigeben von nicht mehr benötigten Objekten verhindert Speicherverluste.

Der GC verwendet einen Zählmechanismus, um die zu löschenden Elemente zu bestimmen. Wenn keine Referenzen auf ein bestimmtes Objekt verweisen (d. h. $counter = 0), kann dieses Objekt bereinigt werden.

Es funktioniert ziemlich gut, aber einige Referenzen können problematisch sein:

class A {
    public $b;
}

class B {
    public $a;
}

$a = new A();
$b = new B();

$a->b = $b;
$b->a = $a;

unset($a);
unset($b);
Nach dem Login kopieren
Nach dem Login kopieren

In diesem Fall eines schlechten Designs gibt PHP den Speicher nicht frei, selbst wenn wir $a und $b deaktivieren, da sie aufeinander verweisen, was PHP glauben lässt, dass sie noch verwendet werden.

Glücklicherweise gibt es dafür einen anderen Mechanismus namens Cycle Collector:

gc_collect_cycles();
Nach dem Login kopieren

Grob gesagt durchläuft der Sammler alle Referenzen und wendet einen Algorithmus an, um verwendete Objekte zu markieren, der die zu sammelnden Objekte (die nicht markierten) aufdeckt.

PHP löst jedoch keine automatische Zyklussammlung aus, bis der Schwellenwert von 10.000 Objekten mit potenziellen zyklischen Referenzen erreicht ist.

Auch hier ist es keine Zauberei, daher müssen Sie gc_collect_cycles() nur in wenigen Fällen aufrufen.

? TANSTAAFL

Schlechtes Design kann zu überkomplexen Beziehungen zwischen Objekten führen, was zu mehr Referenzen und häufigerer Speicherbereinigung führt.

Jedes referenzgezählte Objekt benötigt zusätzlichen Speicher für seinen Referenzzähler.

Quelle: Wikipedia – Referenzzählung

Der mit Speicherbereinigungsvorgängen verbundene Overhead kann die globale Leistung erheblich beeinträchtigen und letztendlich die Ausführungszeit in bestimmten Szenarien verlängern.

Vor 10 Jahren erzielte Composer allein durch die Verwendung der Funktion gc_disable() einen enormen Leistungsschub.

Quelle: Composer – GC deaktivieren

Tatsächlich hat PHP 7 den GC drastisch verbessert, sodass er nicht mehr das ist, was er 2014 war.

Darüber hinaus verbesserten PHP 8-Versionen die Speicherzuweisungsstrategien und fügten weitere nützliche Statistiken über GC-Vorgänge zur besseren Überwachung hinzu (gc_status() in 8.3).

Die meisten PHP-Anwendungen sind anforderungsgesteuert und der Speicher wird am Ende der Anforderung automatisch gelöscht.

Noch einmal, es ist ziemlich cool, aber keine Magie. Was passiert mit asynchronen Anfragen und langlebigen Objekten/Daemons?

Irgendwann kann es zu Speicherverlusten kommen.

? Wie unterschiedlich ist der GC von PHP?

Zu diesem Zeitpunkt sehen Sie möglicherweise nicht, wie sich der GC von PHP von anderen Sprachen unterscheidet.

Andere Sprachen verlassen sich meist nicht auf die Referenzzählung, um Müll zu sammeln, oder verwenden möglicherweise andere Implementierungen.

Viele verwenden beispielsweise den Tracing-Algorithmus, der auch ungenutzte Objekte markiert, aber nicht inkrementell arbeitet. Es handelt sich um eine Graphendurchquerung.

Außerdem erlauben einige Sprachen keine solche direkte Steuerung (z. B. Ein/Aus zur Laufzeit).

Wie üblich gibt es einige Vor- und Nachteile, sodass Sie möglicherweise einige hybride Ansätze sehen werden.

?‍? Interaktion mit dem PHP-GC

Sie können die integrierten gc_*-Helfer nutzen.

Zum Beispiel:

  • gc_collect_cycles löst die Garbage Collection manuell aus
  • gc_status() gibt den aktuellen Status aus
  • gc_disable() deaktiviert es
  • gc_enable() aktiviert es

Diese Funktionen sind bei Bedarf zum Debuggen oder zur Feinabstimmung der Speicherbereinigung hilfreich.

? Speicherfehler verstehen

Sie können diesen Beitrag lesen, um weitere Einblicke zu erhalten:

PHP: The Garbage Collector explained with simple words

PHP: Speicherfehler

spO0q ? ・ 24. Mai 23

#php #Anfänger #Programmierung

? Schwache Karten zur Rettung?

PHP 7.4 führte schwache Referenzen ein und PHP 8 führte schwache Karten ein.

Eine schwache Karte könnte als eine Sammlung schwacher Referenzen beschrieben werden.

Diese Datenstruktur ist ein vielseitiger Schlüsselwertspeicher, der PHP hilft, den Überblick über Elemente zu behalten, ohne Unordnung zu schaffen oder übermäßig viel Platz zu verbrauchen.

Sie können es als temporären Speicher betrachten, der sofort gelöscht wird, wenn er nicht mehr benötigt wird, da es keine [starken] Hinweise gibt, die die Müllsammlung verhindern könnten:

class A {
    public $b;
}

class B {
    public $a;
}

$a = new A();
$b = new B();

$a->b = $b;
$b->a = $a;

unset($a);
unset($b);
Nach dem Login kopieren
Nach dem Login kopieren

✅ Vorteile

  • ziemlich unkompliziert
  • ideal zum Zwischenspeichern oder Auswendiglernen (z. B. teure Berechnungen)

❌ Nachteile

  • Während Schlüssel (Objekte) die Speicherbereinigung nicht verhindern, können Werte dies tun, daher kann der Begriff „beliebige Werte“ irreführend sein (verwenden Sie nur einfache Datentypen als Werte)
  • Wertvolle Anwendungsfälle sind begrenzt

? Optimieren Sie den Code

  • Nutzen Sie Entwurfsmuster, die gegenseitige Abhängigkeiten reduzieren
  • Abhängigkeitsinjektion verwenden
  • Laden Sie keine zu großen Datensätze in den Speicher und verwenden Sie Sammlungen und Generatoren anstelle riesiger Arrays
  • Speichernutzung überwachen
  • Profilieren Sie Ihren Code mit Metriken
  • Verwenden Sie gc_enable(), gc_disable() und gc_collect_cycles() sparsam

Einpacken

Bei den meisten Verwendungszwecken müssen Sie sich keine Gedanken über die Speicherverwaltung machen, da PHP diese bereits übernimmt.

Da moderne Stacks jedoch langlebige Objekte verwenden, müssen Sie Ihre Anwendung auf mögliche Speicherlecks überwachen.

Wenn Sie Probleme haben, müssen Sie möglicherweise den Code optimieren und/oder direkt mit dem GC interagieren.

Das obige ist der detaillierte Inhalt vonPHP: Der Garbage Collector mit einfachen Worten erklärt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage