Maison > Article > interface Web > Javascript a-t-il gc ?
Il existe un GC (mécanisme de collecte des déchets) en javascript. JavaScript est un langage qui utilise un mécanisme de récupération de place. L'environnement d'exécution est responsable de la gestion de la mémoire lorsque le code est exécuté et détruit automatiquement les objets inutiles (objets non référencés) de la mémoire.
L'environnement d'exploitation de ce tutoriel : système Windows 7, JavaScript version 1.8.5, ordinateur Dell G3.
Concepts liés à la collecte des déchets
① Qu'est-ce que les déchets
Les objets qui ne sont pas utilisés (référencés) sont des déchets.
② Qu'est-ce que le garbage collection ?
Les objets qui ne sont pas référencés sont détruits et la mémoire est libérée, ce qui est un garbage collection.
Les langages de programmation tels que C et C++ nécessitent un garbage collection manuel.
Collecte automatique des déchets pour Java, JavaScript, PHP, Python et d'autres langages.
JS dispose d'un mécanisme de collecte automatique des déchets, qui détruira automatiquement ces objets indésirables de la mémoire. Nous n'avons pas besoin et ne pouvons pas effectuer d'opérations de collecte des déchets. Tout ce que nous avons à faire est de définir les objets qui ne sont plus utilisés sur null.
Méthode de comptage de références
Idée
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
Problème de référence circulaire
Netscape Navigator 3.0 adopte
function Example(){ let ObjectA = new Object(); let ObjectB = new Object(); ObjectA.p = ObjectB; ObjectB.p = ObjectA; } Example();
ObjectA = null; ObjectB = null;
Afin de résoudre le problème de fuite de mémoire provoqué par les références circulaires, Netscape Navigator 4.0 a commencé à utilisez la méthode mark and clear
En 2008, IE, Firefox, Opera, Chrome et Safari utilisaient tous le nettoyage de balisage (ou une variante de celui-ci) dans leurs implémentations JavaScript, ne différant que par la fréquence à laquelle ils exécutaient le garbage collection.
Idée
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离开执行上下文,等待垃圾回收
les instructions const et let améliorent les performances
Collecte des ordures du moteur V8
La collecte des ordures du moteur V8 adopte la méthode de marquage et de balayage et la méthode de collecte générationnelle
Il est divisé en nouvelle génération et ancienne génération
nouvelle génération
Le garbage collection de nouvelle génération utilise l'algorithme
Scavenge 配 Petite mémoire et petite quantité de mémoire nouvellement allouée <code>Scavenge
算法
分配给常用内存和新分配的小量内存
内存大小
分区
运行
Scavenge
Scavenge
🎜新生代 -> 老生代
老生代
老生代采用
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高级教程】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!