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.
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
Idee
Variablen referenzieren nur den WertWenn sich eine Variable auf den Wert bezieht, beträgt die Anzahl der Referenzen +1
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
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.
function Example(){ let ObjectA = new Object(); let ObjectB = new Object(); ObjectA.p = ObjectB; ObjectB.p = ObjectA; } Example();
ObjectA = null; ObjectB = null;
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
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离开执行上下文,等待垃圾回收
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
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
算法
分配给常用内存和新分配的小量内存
内存大小
分区
运行
Scavenge
Scavenge
-Algorithmus🎜新生代 -> 老生代
老生代
老生代采用
mark-sweep
标记清除和mark-compact
标记整理
通常存放较大的内存块和从新生代分配过来的内存块
1类
2类
3类
1类
,然后进行深度优先遍历。2类
。3类
。标记完成之后,将标记为1类
的对象进行内存释放
Mark-compact
垃圾回收完成之后,内存空间是不连续的。
这样容易造成无法分配较大的内存空间的问题,从而触发垃圾回收。
所以,会有Mark-compact步骤将未被回收的内存块整理为连续地内存空间。
频繁触发垃圾回收会影响引擎的性能,内存空间不足时也会优先触发Mark-compact
垃圾回收优化
全局变量
// 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就可以
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!