共计 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 中的垃圾回收机制
正文完
发表至: javascript
2020-12-12