Hat Javascript GC?
Es gibt GC (Garbage Collection Mechanism) in Javascript. JavaScript ist eine Sprache, die einen Garbage-Collection-Mechanismus verwendet. Die Ausführungsumgebung ist für die Speicherverwaltung verantwortlich, wenn der Code ausgeführt wird, und zerstört automatisch Garbage-Objekte (Objekte, auf die nicht verwiesen wird).
Die Betriebsumgebung dieses Tutorials: Windows 7-System, JavaScript-Version 1.8.5, Dell G3-Computer.
Garbage-Collection-Mechanismus (GC) in JavaScript
Konzepte im Zusammenhang mit der Garbage-Collection
① Was ist Müll? Nicht verwendete (referenzierte) Objekte sind Müll.
② Was ist Garbage Collection?
Objekte, auf die nicht verwiesen wird, werden zerstört und der Speicher wird freigegeben, was Garbage Collection ist.
Programmiersprachen wie C und C++ erfordern eine manuelle Speicherbereinigung.Automatische Speicherbereinigung für Java, JavaScript, PHP, Python und andere Sprachen.
JS verfügt über einen automatischen Garbage-Collection-Mechanismus, der diese Garbage-Objekte automatisch aus dem Speicher zerstört. Wir benötigen und können keine Garbage-Collection-Vorgänge durchführen. Wir müssen lediglich Objekte, die nicht mehr verwendet werden, auf Null setzen. Warum Garbage Collection benötigt wirdIn C/C++ stellt die Verfolgung der Speichernutzung und die Speicherverwaltung eine große Belastung für Entwickler dar
JavaScript ist eine Sprache, die einen Garbage-Collection-Mechanismus verwendet, was bedeutet, dass die Ausführungsumgebung für die Verwaltung verantwortlich ist Speicher beim Ausführen von Code hilft Entwicklern, diese Belastung zu verringern
- Realisieren Sie die Speicherzuweisung und das Ressourcenrecycling durch automatische Speicherverwaltung
- Die Grundidee ist sehr einfach: Bestimmen Sie, welche Variable nicht mehr verwendet wird, und weisen Sie ihren Speicherplatz zu. Freigabe
- Dieser Prozess ist zyklisch, was bedeutet, dass das Garbage-Collection-Programm von Zeit zu Zeit ausgeführt wird
- Speicher wie Objekte, Zeichenfolgen und Objekte in JS sind nicht festgelegt, sondern nur die tatsächlich verwendeten Speicher werden zu gegebener Zeit dynamisch zugewiesen ist aktiv
- Diese Speicher müssen freigegeben werden, nachdem sie nicht zur Wiederverwendung verwendet wurden. Andernfalls kommt es zu einem Absturz, nachdem der verfügbare Speicher des Computers erschöpft ist
- Die wichtigsten Speicherbereinigungsmethoden in der Geschichte der Browserentwicklung sind
- Referenzzählung Methode
Markierungs- und Löschmethode-
Idee
Variablen referenzieren nur den WertWenn sich eine Variable auf den Wert bezieht, beträgt die Anzahl der Referenzen +1
- Wenn die Variable Wenn die Referenz überschrieben oder gelöscht wird, beträgt die Anzahl der Referenzen -1
- Wenn die Anzahl der Referenzen 0 ist, kann dieser Speicher sicher freigegeben werden.
let arr = [1, 0, 1] // [1, 0, 1]这块内存被arr引用 引用次数为1 arr = [0, 1, 0] // [1, 0, 1]的内存引用次数为0被释放 // [0, 1, 0]的内存被arr引用 引用次数为1 const tmp = arr // [0, 1, 0]的内存被tmp引用 引用次数为2
Nach dem Login kopierenZirkuläres Referenzproblem
Netscape Navigator 3.0 übernimmt
In diesem Beispiel verweisen die Eigenschaften von ObjectA und ObjectB jeweils aufeinanderNachdem diese Funktion ausgeführt wurde, wird die Die Häufigkeit, mit der das Objekt referenziert wird, wird nicht 0, was sich auf die normale GC auswirkt.
- Bei mehrmaliger Ausführung führt dies zu schwerwiegenden Speicherverlusten. Bei der Mark-and-Clear-Methode tritt dieses Problem nicht auf.
function Example(){ let ObjectA = new Object(); let ObjectB = new Object(); ObjectA.p = ObjectB; ObjectB.p = ObjectA; } Example();
ObjectA = null; ObjectB = null;
- Markieren und löschen Sie die Methode
Um das durch Zirkelverweise verursachte Speicherverlustproblem zu lösen, begann Netscape Navigator 4.0 damit Verwenden Sie die Mark-and-Clear-Methode
Bis 2008 nutzten IE, Firefox, Opera, Chrome und Safari alle die Markup-Bereinigung (oder eine Variante davon) in ihren JavaScript-Implementierungen und unterschieden sich nur darin, wie oft sie die Garbage Collection durchführten.
Idee
Markieren Sie die Variable „betreten“, wenn sie in den Ausführungskontext eintrittMarkieren Sie gleichzeitig die Variable „verlassen“, wenn sie den Ausführungskontext verlässt
- Von nun an kann diese Variable nicht mehr sein zugegriffenIn der nächsten Garbage Collection wird der Speicher bei Bedarf freigegeben
- const- und let-Anweisungen verbessern die Leistung
function Example(n){ const a = 1, b = 2, c = 3; return n * a * b * c; } // 标记Example进入执行上下文 const n = 1; // 标记n进入执行上下文 Example(n); // 标记a,b,c进入执行上下文 console.log(n); // 标记a, b, c离开执行上下文,等待垃圾回收
Nach dem Login kopieren
const und let tragen nicht nur zur Verbesserung des Codestils bei, sondern auch zur Verbesserung der Garbage-Collection-Leistung const und let make JS Bereich auf Blockebene. Wenn der Bereich auf Blockebene früher als der Funktionsbereich endet, greift das Garbage-Collection-Programm früher ein
- Recyceln Sie den wiederhergestellten Speicher so früh wie möglich, um die Leistung der Garbage-Collection zu verbessern
- V8-Motor-Garbage-Collection
Die Garbage-Collection des V8-Motors verwendet die Mark-and-Sweep-Methode und die Generations-Collection-Methode.
Sie ist in neue Generation und alte Generation unterteiltDie Garbage Collection der neuen Generation verwendet den Algorithmus
Scavenge< /code> 配 Kleiner Speicher und neu zugewiesene kleine Speichermenge </p></blockquote><blockquote><p></p> Speichergröße </blockquote><p><strong> 32-Bit-System 16 MB Speicher </strong></p> 64-Bit-System 32 MB Speicher <blockquote> <p><code>Scavenge
算法
分配给常用内存和新分配的小量内存
内存大小
- 32位系统16M内存
- 64位系统32M内存
分区
- 新生代内存分为以下两区,内存各占一半
- From space
- To space
运行
- 实际运行的只有From space
- To space处于空闲状态
🎜 Partition 🎜🎜🎜 Der Speicher der neuen Generation ist in die folgenden zwei Bereiche unterteilt, die jeweils die Hälfte des Speichers belegen läuft tatsächlich und ist inaktiv🎜🎜🎜🎜🎜Scavenge
Scavenge
-Algorithmus🎜- 当From space内存使用将要达到上限时开始垃圾回收,将From space中的不可达对象都打上标记
- 将From space的未标记对象复制到To space。
- 解决了内存散落分块的问题(不连续的内存空间)
- 相当于用空间换时间。
- 然后清空From space、将其闲置,也就是转变为To space,俗称反转。
新生代 -> 老生代
- 新生代存放的是新分配的小量内存,如果达到以下条件中的一个,将被分配至老生代
- 内存大小达到From space的25%
- 经历了From space <-> To space的一个轮回
- 新生代存放的是新分配的小量内存,如果达到以下条件中的一个,将被分配至老生代
老生代
老生代采用
mark-sweep
标记清除和mark-compact
标记整理
通常存放较大的内存块和从新生代分配过来的内存块
- 内存大小
- 32位系统700M左右
- 64位系统1.4G左右
- 分区
- Old Object Space
- 字面的老生代,存放的是新生代分配过来的内存。
- Large Object Space
- 存放其他区域放不下的较大的内存,基本都超过1M
- Map Space
- 存放存储对象的映射关系
- Code Space
- 存储编译后的代码
- Old Object Space
- 回收流程
- 标记分类(三色标记)
- 未被扫描,可回收,下面简称
1类
- 扫描中,不可回收,下面简称
2类
- 扫描完成,不可回收,下面简称
3类
- 未被扫描,可回收,下面简称
- 遍历
- 采用深度优先遍历,遍历每个对象。
- 首先将非根部对象全部标记为
1类
,然后进行深度优先遍历。 - 遍历过程中将对象压入栈,这个过程中对象被标记为
2类
。 - 遍历完成对象出栈,这个对象被标记为
3类
。 - 整个过程直至栈空
- Mark-sweep
标记完成之后,将标记为
1类
的对象进行内存释放
- 标记分类(三色标记)
Mark-compact
垃圾回收完成之后,内存空间是不连续的。
这样容易造成无法分配较大的内存空间的问题,从而触发垃圾回收。
所以,会有Mark-compact步骤将未被回收的内存块整理为连续地内存空间。
频繁触发垃圾回收会影响引擎的性能,内存空间不足时也会优先触发Mark-compact
垃圾回收优化
- 增量标记
- 如果用集中的一段时间进行垃圾回收,新生代倒还好,老生代如果遍历较大的对象,可能会造成卡顿。
- 增量标记:使垃圾回收程序和应用逻辑程序交替运行,思想类似Time Slicing
- 并行回收
- 在垃圾回收的过程中,开启若干辅助线程,提高垃圾回收效率。
- 并发回收
- 在逻辑程序执行的过程中,开启若干辅助线程进行垃圾回收,清理和主线程没有任何逻辑关系的内存。
内存泄露场景
全局变量
// exm1 function Example(){ exm = 'LeBron' } // exm2 function Example(){ this.exm = 'LeBron' } Example()
未清除的定时器
const timer = setInterval(() => { //... }, 1000) // clearInterval(timer)
闭包
function debounce(fn, time) { let timeout = null; return function () { if (timeout) { clearTimeout(timeout); } timeout = setTimeout(() => { fn.apply(this, arguments); }, time); }; } const fn = debounce(handler, 1000); // fn引用了timeout
未清除的DOM元素引用
const element = { // 此处引用了DOM元素 button:document.getElementById('LeBron'), select:document.getElementById('select') } document.body.removeChild(document.getElementById('LeBron'))
如何检测内存泄漏
这个其实不难,浏览器原带的开发者工具Performance就可以
- 步骤
- F12打开开发者工具
- 选择Performance工具栏
- 勾选屏幕截图和Memory
- 点击开始录制
- 一段时间之后结束录制
- 结果
- 堆内存会周期性地分配和释放
- 如果堆内存的min值在逐渐上升则存在内存泄漏
优化内存使用
1、尽量不在for循环中定义函数
// exm const fn = (idx) => { return idx * 2; } function Example(){ for(let i=0;i<1000;i++){ //const fn = (idx) => { // return idx * 2; // } const res = fn(i); } }
2、尽量不在for循环中定义对象
function Example() { const obj = {}; let res = ""; for (let i = 0; i < 1000; i++) { // const obj = { // a: i, // b: i * 2, // c: i * 3, // }; obj.a = i; obj.b = i * 2; obj.c = i * 3; res += JSON.stringify(obj); } return res }
3、清空数组
arr = [0, 1, 2] arr.length = 0; // 清空了数组,数组类型不变 // arr = [] // 重新申请了一块空数组对象内存
【推荐学习:javascript高级教程】
Das obige ist der detaillierte Inhalt vonHat Javascript GC?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript. Im heutigen digitalen Zeitalter müssen immer mehr Unternehmen und Dienste Online-Reservierungsfunktionen bereitstellen. Es ist von entscheidender Bedeutung, ein effizientes Online-Reservierungssystem in Echtzeit zu implementieren. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Reservierungssystem implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist WebSocket? WebSocket ist eine Vollduplex-Methode für eine einzelne TCP-Verbindung.

Die Garbage Collection (GC) von Golang war schon immer ein heißes Thema unter Entwicklern. Als schnelle Programmiersprache kann der integrierte Garbage Collector von Golang den Speicher sehr gut verwalten, mit zunehmender Programmgröße treten jedoch manchmal Leistungsprobleme auf. In diesem Artikel werden die GC-Optimierungsstrategien von Golang untersucht und einige spezifische Codebeispiele bereitgestellt. Die Garbage Collection im Garbage Collector von Golang Golang basiert auf gleichzeitigem Mark-Sweep (concurrentmark-s

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Verwendung: In JavaScript wird die Methode insertBefore() verwendet, um einen neuen Knoten in den DOM-Baum einzufügen. Diese Methode erfordert zwei Parameter: den neuen Knoten, der eingefügt werden soll, und den Referenzknoten (d. h. den Knoten, an dem der neue Knoten eingefügt wird).
