Appearance
Javascript性能优化
内存管理
- 内存:可读写的、可操作的空间
- 管理:人为对空间进行的申请、使用、释放操作
- 内存管理:对"管理"进行的干预行为
- 管理流程:申请-使用-释放
javascript
// 申请
let obj = {}
// 使用
obj.name = "tom"
// 释放
obj = null
JS中的垃圾回收(GC, garbage collection)
js中内存管理是系统自动处理的。当一个对象不再被引用,或者不能从根上访问到的时候,都会被当做垃圾,进入垃圾回收
GC涉及到两个问题:
- 如何查找?
- 如何释放?
一般GC都会有一套算法。常见的有四种:
- 引用计数
- 标记清除
- 标记整理
- 分代回收
引用计数
顾名思义。系统会清查引用的对象,假定所有对象一开始都是0引用。当检测到一个对象的引用关系被改变,那么就根据其改变方向是"引用"还是"释放"做出改变。引用+1,释放-1。当引用数字为0时系统回收。
- 优点
发现垃圾时立即回收
最大限度减少程序暂停。引用计数器时刻监听各个引用,减少内存占满的情况
- 缺点
无法回收循环引用的对象
时间开销更大
标记清除
这一算法分成两个阶段,标记和清除。首先会遍历并标记活动对象,然后会再遍历一次,清除没有标记的对象,与此同时抹除第一次的标记。
- 优点
能解决循环引用无法回收的问题
- 缺点
会导致内存空间碎片化
标记整理
与标记清除相似,但在清除阶段会先移动对象位置,使得可用内存空间连续(也就是解决了内存空间碎片化的问题)。
但是,由于多了操作,导致不能立即回收对象
V8引擎
V8引擎内存设上限,64位不超过1.5G,32位不超过800M,