- 内存管理
- 垃圾回收 GC算法
- v8引擎垃圾回收
- performance工具
- 实例
内存管理
- 内存:由可读写单元组成,表示一片可操作空间
- 管理: 人为去操作一片空间是申请,使用和释放
js中内存管理流程
//申请空间
let obj = {}
//使用空间
obj.name = 'xiaoming'
//释放空间
obj = null
垃圾回收
- js内存管理是自动的
- 对象不再被引用变为垃圾对象
- 对象不能从根(全局上下文)上访问为垃圾对象
可达对象 (能访问到的对象)
常见GC算法 (垃圾回收机制)
- 引用计数 (设置引用数,判断当前引用数是否为0)
1 优点 : 发现垃圾立即回收 最大限度减少程序暂停(发现内存块快占满立即回收引用数为0 的对象空间)
2 缺点 : 无法回收循环引用对象 时间开销大(时刻监控对象引用数是否为0)
//对象相互引用,引用数不为0,无法回首
function fn(){
obj1 = {}
obj2 = {}
obj1.name = obj2
obj2.name = obj1
}
fn()
- 标记清除(1 遍历所有对象,找到标记活动对象(可达) 2 遍历所有对象清除没有标记的对象 3回收空间 )
1.优点 可解决对象循环引用
2.缺点 空间碎片化 不能让空间最大化使用 不会立即回收 - 标记整理
和标记清除一样,只不过清除前对移动对象位置,让活动与非活动位置连续,对空间内存进行整理, - 分代回收
v8引擎
- js执行引擎
- 即时编译
- 内存设限
v8采用分代回收的思想,内存分为新生代和老生代对象区域,针对不同对象区域采用不同算法
- v8空间一份为二 ,小空间存储新生代对象(指存活时间较短的对象)
- 新生代回收 复制算法 + 标记整理
1.空间一分为二 ,等大,使用空间from(对象默认存储空间),空闲空间to
2.触发GC机制,找到活动对象,标记整理后拷贝到to
3.to与from交换,完成释放
回收过程可能出现晋升(新生代=>老生代)
一轮GC后还存活的新生代,to的使用率超过25%
监控内存
shift + esc 浏览器任务管理器 javascript内存括号数字看到js可达对象内存大小使用情况
timeLine
内存 堆快照 deta
慎用全局变量
- 全局变量存活上下文执行栈,直到程序退出,是所有作用域的顶端,局部变量可能会污染全局
- 性能分析 jsperf.com
缓存全局变量
原型对象添加方法
避免属性方法的使用,尽量直接用实例对象访问属性
for循环优化 数组长度let i=0,len=arr.length;i<len;i++
文档碎片添加节点document.createDocumentFragment()
for (var i = 0; i < 10; i++) {
var oP = document.createElement('p')
oP.innerHTML = i
document.body.appendChild(oP)
}
const fragEle = document.createDocumentFragment()
for (var i = 0; i < 10; i++) {
var oP = document.createElement('p')
oP.innerHTML = i
fragEle.appendChild(oP)
}