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

猜你喜欢

转载自www.cnblogs.com/xiaofish/p/10662868.html