关于javascript:JavaScript-内存管理及垃圾回收

26次阅读

共计 1448 个字符,预计需要花费 4 分钟才能阅读完成。

目录

  • JavaScript 内存治理

    • 内存为什么须要治理?
    • 内存治理概念
    • JavaScript 中的内存治理
    • JavaScript 内存生命周期
  • JavaScript 的垃圾回收

    • JavaScript 的垃圾回收概念
    • JavaScript 的援用与可达示例

      • 什么是可达对象?
      • 什么是垃圾回收的对象?
  • 理解垃圾回收机制 —— GC
  • JS 执行引擎 V8 罕用的 GC 算法

JavaScript 内存治理

内存为什么须要治理?

咱们如果在写代码的时候不够理解内存治理的一些机制,就会写出一些不易觉察的内存问题的代码。这种代码多了之后,给程序就会带来一些意想不到的bug。所以把握内存治理还是有必要的。

内存治理概念

  • 内存:由可读写单元组成,示意一片可操作空间
  • 治理:人为地去操作一片空间的申请、应用和开释
  • 内存治理:开发者被动申请空间、应用空间、开释空间
  • 治理流程:申请 ——> 应用 ——> 开释

JavaScript 中的内存治理

也和其余语言流程一样:申请、应用、开释

然而因 ECMAScript 中没有提供对应 API,所以js 不能由开发者被动的调用 API 实现空间的治理。

JavaScript 内存生命周期

// 申请
let obj = {}
// 应用
obj.name = 'xm'
// 开释
obj = null

JavaScript 的垃圾回收

JavaScript 的垃圾回收概念

  • 内存治理是主动的,每当咱们创建对象、数组等,它就会主动的跟配内存空间。
  • 对象不再被 援用 时是垃圾。
  • 对象曾经存在,然而这些对象不能从 根上拜访 到时是垃圾。

这个时候 JavaScript 会主动对这些垃圾进行空间的开释和回收,即 JavaScript 的垃圾回收。

可达对象

  • 能够拜访到的对象就是可达对象,能够通过援用,也能够通过上下文的作用域链进行查找
  • JavaScript的根能够了解为时 全局变量对象,可达的规范就是从根登程是否被找到

JavaScript 的援用与可达示例

什么是可达对象?

// 上面的对象空间被 obj 援用了,以后对象可达
let obj = {name: 'xm'}

// 这里援用数值会变动,这个时候 ali 也援用了对象空间
let ali = obj

// obj 对对象空间援用终止,然而 ali 还是能够援用对象空间,那个空间仍旧是可达的
obj = null

什么是垃圾回收的对象?

// 可达对象

function objGroup (obj1, obj2) {
  obj1.next = obj2
  obj2.prev = obj1

  return {
    o1: obj1,
    o2: obj2
  }
}

let obj = objGroup({name: 'obj1'}, {name: 'obj2'})

console.log(obj)
// {//  o1: { name: 'obj1', next: { name: 'obj2', prev: [Circular] } },
//  o2: {name: 'obj2', prev: { name: 'obj1', next: [Circular] } }
//}

下面的例子的可达对象图示如下

之后进行一些操作

delete obj.o1
delete obj.o2.prev

那么 obj.o1 就会变成垃圾,JavaScript引擎就会找到这个对象进行回收。

理解垃圾回收机制 —— GC

GC就是垃圾回收机制的简写,它能够找到内存中的垃圾、并开释和回收空间。所有的语言中都能够见到这种算法,不单单是 JS,上面具体讲一下GC 算法都有哪些?

GC —— 垃圾回收机制意识与算法详解

JS 执行引擎 V8 罕用的 GC 算法

V8是一款支流的 JavaScript 执行引擎,其外部应用了一些 GC 算法,能够具体看看其外部的垃圾回收策略

JavaScript 引擎 V8 中的垃圾回收机制

正文完
 0