JS内存管理与垃圾回收
内存分配
1 var n = 374; // 为数字分配内存 2 var s = 'sessionstack'; // 为字符串分配内存 3 4 var o = { 5 a: 1, 6 b: null 7 }; // 为对象及其值分配内存 8 9 var a = [1, null, 'str']; // (类似对象)为数组及其数组元素值分配内存 10 11 function f(a) { 12 return a + 3; 13 } // 分配一个函数(一个可调用对象) 14 15 // 函数表达式也分配一个对象 16 someElement.addEventListener('click', function() { 17 someElement.style.backgroundColor = 'blue'; 18 }, false);
内存垃圾回收
引用是内存垃圾回收算法所依赖的主要概念之一。
引用计数垃圾回收:这是最简单的内存垃圾回收算法。当一个对象被 0 引用,会被标记为 "可回收内存垃圾"。但当循环引用时,将无法回收垃圾内存。
标记-清除算法
标记-清除算法包含三个步骤:
- 根:一般来说,根指的是代码中引用的全局变量。就拿 JavaScript 来说,window 对象即是根的全局变量。Node.js 中相对应的变量为 "global"。垃圾回收器会构建出一份所有根变量的完整列表。
- 随后,算法会检测所有的根变量及他们的后代变量并标记它们为激活状态(表示它们不可回收)。任何根变量所到达不了的变量(或者对象等等)都会被标记为内存垃圾。
- 最后,垃圾回收器会释放所有非激活状态的内存片段然后返还给操作系统。
四种常见的 JavaScript 内存泄漏
https://github.com/Troland/how-javascript-works/blob/master/memory-management.md