Heim > Web-Frontend > js-Tutorial > Grundlegendes zur Garbage Collection in JavaScript und darüber hinaus

Grundlegendes zur Garbage Collection in JavaScript und darüber hinaus

Susan Sarandon
Freigeben: 2025-01-27 22:32:17
Original
528 Leute haben es durchsucht

Understanding Garbage Collection in JavaScript and Beyond

Kürzlich wurde ich in einem technischen Interview gefragt, wie verschiedene Programmiersprachen mit der Garbage Collection umgehen. Das war eine überraschende, aber auch erfrischende Frage, und sie hat mein Interesse geweckt – ich hatte noch nie zuvor in einem Interview eine so ausführliche Diskussion über die Speicherverwaltung erlebt. Diese Frage gefällt mir und ich würde dieses Thema gerne in einem Blogbeitrag weiter vertiefen.


Effiziente Speicherverwaltung ist für Hochleistungsanwendungen von entscheidender Bedeutung. Garbage Collection (GC) Gewährleistet die automatische Wiederverwendung von ungenutztem Speicher, um Speicherlecks und -abstürze zu verhindern. In diesem Artikel konzentrieren wir uns auf die Funktionsweise der Garbage Collection in JavaScript, untersuchen andere in Programmiersprachen verwendete Methoden und stellen Beispiele zur Veranschaulichung dieser Konzepte bereit.


Was ist Garbage Collection?

Garbage Collection ist der Prozess der Rückgewinnung von Speicher, der von Objekten belegt ist, die nicht mehr verwendet werden. Sprachen mit automatischer Garbage Collection abstrahieren diesen Prozess, sodass Entwickler den Speicher nicht manuell verwalten müssen. Beispielsweise verwendet JavaScript einen Tracking Garbage Collector, während andere Sprachen andere Techniken verwenden.


Garbage Collection in JavaScript

JavaScript basiert auf der Methode Tracking Garbage Collection, insbesondere dem Mark-Sweep-Algorithmus. Lassen Sie es uns aufschlüsseln:

1. Mark-clear-Algorithmus

Dieser Algorithmus bestimmt, welche Objekte im Speicher „erreichbar“ sind und gibt diejenigen frei, die nicht erreichbar sind:

  1. Stufe markieren:
    • Beginnen Sie mit einem „Root“-Objekt (z. B. window in einem Browser oder dem globalen Objekt in Node.js).
    • Durchlaufen Sie alle Objekte, die von diesen Stammobjekten aus erreichbar sind, und markieren Sie sie als „lebendig“.
  2. Clear-Phase:
    • Scannen Sie den Heap und geben Sie Objekte frei, die nicht als erreichbar markiert sind.

Beispiel:

<code class="language-javascript">function example() {
  let obj = { key: "value" }; // obj 可达
  let anotherObj = obj; // anotherObj 引用 obj

  anotherObj = null; // 引用计数减少
  obj = null; // 引用计数减少到 0
  // obj 现在不可达,将被垃圾回收
}</code>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

2. Generationsübergreifende Müllabfuhr

Moderne JavaScript-Engines (z. B. V8 in Chrome/Node.js) verwenden Generational GC, um die Speicherbereinigung zu optimieren. Der Speicher ist unterteilt in:

  • Neue Generation: Kurzlebige Objekte (z. B. Funktionsbereichsvariablen) werden hier gespeichert und häufig gesammelt.
  • Alte Generation: Langlebige Objekte (z. B. globale Variablen) werden hier gespeichert und seltener gesammelt.

Warum ist Generationen-GC effizienter?

  • Die meisten Objekte in JavaScript sind kurzlebig und können schnell gesammelt werden.
  • Langlebige Objekte werden auf die alte Generation verschoben, wodurch die Notwendigkeit häufiger Scans verringert wird.

Andere Müllsammelstrategien

Lassen Sie uns untersuchen, wie andere Sprachen mit der Speicherbereinigung umgehen:

<.> 1. Referenzzählung

Wie viele Verweise auf die Referenzzählung sind an ein Objekt gerichtet. Wenn die Referenzzahl auf 0 reduziert wird, wird das Objekt freigegeben.

Vorteile:

Einfacher und sofort recycelter Speicher.
  • Vorhersagen.
  • Nachteile:

Kreisförmige Referenz

: Wenn die beiden Objekte miteinander verwiesen werden, werden ihre Zählungen niemals 0 erreichen.
  • Beispiel: (Python -Referenzzahl)

<.> 2. Manuellem Speichermanagement

c
<code class="language-javascript">function example() {
  let obj = { key: "value" }; // obj 可达
  let anotherObj = obj; // anotherObj 引用 obj

  anotherObj = null; // 引用计数减少
  obj = null; // 引用计数减少到 0
  // obj 现在不可达,将被垃圾回收
}</code>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
und

c müssen die Entwickler den Speicher ausdrücken und freigeben.

Beispiel:

(c Speicherverwaltung) Vorteile:

steuern Sie die Verwendung des Speichers vollständig.

<code class="language-python">a = []
b = []
a.append(b)
b.append(a)
# 这些对象相互引用,但不可达;现代 Python 的循环收集器可以处理这种情况。</code>
Nach dem Login kopieren
Nach dem Login kopieren
Nachteile:

Speicherlecks (vergessen, Speicher freizusetzen) und suspendierte Zeiger (vorzeitig freigebener Speicher).
  • <.> 3. verfolgen Müllrecycling mit einem kreisförmigen Kollektor

Einige Sprachen (z. B. Python) kombinieren die Zykluserkennung Referenz für die Zyklusreferenz.

  • Der Zykluskollektor scannen das Objekt regelmäßig, um den Zyklus zu erfassen (die Gruppe gegenseitige Referenzobjektgruppe, auf die nicht aus dem Stammobjekt zugegriffen werden kann). Sobald der Zyklus gefunden wurde, zerstört der Kollektor ihn und recycelt das Gedächtnis.
Der Zyklussammler löst den größten Nachteil (Zyklusreferenz) der reinen Referenzzählung. Sie erhöhen zusätzliche Ausgaben, stellen jedoch sicher, dass sie aufgrund des Zyklus keine Speicherlecks verursachen.

<.> 4. Rostes Kreditinspektionsgerät (kein GC)

Rost verwendet eine andere Methode, wodurch der Müllrecycling vollständig vermieden wird. Im Gegenteil, Rost verwendet das Inspektionsgerät , um strenge Eigentumsregeln durchzusetzen:

    🎜
  • : Es gibt jeweils nur einen Besitzer.
  • liehen Sie
  • : Sie können Referenz ausleihen (uncharakteristisch oder variabel), aber nur eine Variable Referenz zulassen, um

Datenwettbewerb zu verhindern.

Der Lebenszyklus : Wenn der Inferenzwert des Compilers den Umfang des Umfangs überschreitet und den Speicher automatisch freigibt. Dieses System stellt sicher, dass der Speicher sicher ist und keine herkömmlichen GCs erfordert, so dass Rost den Leistungsvorteil des manuellen Speichermanagements hat und gleichzeitig dazu beiträgt, häufige Fehler wie suspendierte Zeiger zu vermeiden.

  • ergänzende Erklärung. #DATA -Wettbewerb erfolgt in gleichzeitiger oder paralleler Programmierung. Da es keinen Mechanismus gibt (z. B. Schlösser oder Atomoperationen), um diesen Zugriff auf den Parallelität zu koordinieren, kann der endgültige Zustand der gemeinsam genutzten Daten unvorhersehbar und inkonsistent sein, die schwer zu finden sind.

    Die Müllrecyclingstrategie vergleicht

    ---
    方法 语言 优点 缺点
    引用计数 早期的 Python,Objective-C 立即回收,易于实现 循环引用失效
    追踪式(标记-清除) JavaScript,Java 处理循环引用,对于大型堆效率高 停止世界暂停
    分代式 GC JavaScript,Java 针对短暂的对象进行了优化 实现更复杂
    手动管理 C,C 完全控制 容易出错,需要仔细处理
    混合式(引用计数 循环收集器) 现代 Python 两全其美 仍然需要定期的循环检测
    借用检查器 Rust 无需 GC,防止数据竞争 学习曲线较陡峭,所有权规则
    JavaScript Wie man mit gemeinsamen Szenen umgeht

    Kreisförmige Referenz

    JavaScripts Tracking -Müllwiederherstellung kann die zyklische Referenz behandeln:

    Ereignisüberwachung und -verschluss

    <code class="language-javascript">function example() {
      let obj = { key: "value" }; // obj 可达
      let anotherObj = obj; // anotherObj 引用 obj
    
      anotherObj = null; // 引用计数减少
      obj = null; // 引用计数减少到 0
      // obj 现在不可达,将被垃圾回收
    }</code>
    Nach dem Login kopieren
    Nach dem Login kopieren
    Nach dem Login kopieren
    Wenn der einfallende Monitor nicht korrekt gereinigt wird, kann er versehentlich Speicherleckage verursachen:

    Zusammenfassung

    <code class="language-python">a = []
    b = []
    a.append(b)
    b.append(a)
    # 这些对象相互引用,但不可达;现代 Python 的循环收集器可以处理这种情况。</code>
    Nach dem Login kopieren
    Nach dem Login kopieren

    JavaScript verwendet

    verfolgte Müllrecychers aus dem -Algorithmus

    aus dem Mobilisierungsverwaltungsspeicher.
    1. geteiltes GC Die Leistung optimieren, indem Sie auf das kurze Objekt achten. Verschiedene Strategien verwenden andere Sprachen:
    2. Referenzzählung
    3. : Einfach, aber leicht zu erfolgen. Manuelles Management
    4. : Voll kontrolliert, aber leicht zu machen.
      • gemischte Methode
      • : kombiniert mit Strategien, um eine bessere Leistung zu erzielen. Rusts Kreditinspektionsgerät
      • : Kein GC, aber es gibt strenge Eigentumsregeln.
      • achten Sie auf die potenziellen Speicherlecks in JavaScript, insbesondere bei Schließungen und Ereignisüberwachung.
      • Dies ist eine hervorragende Gelegenheit, die Sprache für Müllrecyclingstrategien zu verstehen. Meiner Meinung nach kann Ihnen das Verständnis des Arbeitsprinzips des Müllrecyclings nicht nur beim Schreiben eines effizienten Codes helfen, sondern ermöglicht es Ihnen auch, die mit dem Speicher verbundenen Fehler effektiv zu debuggen.
      • Referenz
    5. JavaScript und Speicherverwaltung: MDN -Dokument
    6. V8 Müllrecycling: V8 Blog über Müllrecycling

    Rusts Besitz: Rust -Programmiersprachbücher


    Java -Müllrecycling: Oracle -Dokument

    Pythons GC: Python GC -Modul

Das obige ist der detaillierte Inhalt vonGrundlegendes zur Garbage Collection in JavaScript und darüber hinaus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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