- js内存管理是自动的
- 对象不再被引用就是垃圾
- 对象不能从根上访问就是垃圾
js中可达对象
- 可以访问的对象(引用,作用域链)
- 可达对象是从根上出发是否能够被找到
- js的根理解为全局变量的对象
GC算法
概念
- GC是一种机制,垃圾回收具体完成的工作
- 工作内容就是查找垃圾释放空间,回收空间
- 算法就是查找和回收时遵循的规则
引用计数算法实现
- 核心思想:设置引用数,判断当前引用数是否为0
- 引用计数器
- 引用关系修改时修改引用数字
- 引用数字为0立即回收
优点:发现垃圾立即回收,最大限度减少程序暂停
缺点:无法回收循环引用的对象,时间消耗大
标记清除算法
- 核心思想:分标记和清除两个阶段完成
- 遍历所有对象找到活动对象
- 遍历所有对象清除没有标记对象
- 回收到相应空间
优点:解决循序引用问题
缺点
B,C区域没有标记会被垃圾回收机制清除放入空闲列表将其分配给其他内存空间利用,空间地址可以理解为和头和域组成(头公用),B有两个空间地址,C有一个空间地址,如果此时有一个D进来需要1.5个空间地址,那就不好分配,B和C被回收之后地址不连续(被A分割),缺点就是空间碎片化
标记整理算法
- 标记整理可以看成标记清除的增强
- 标记阶段的操作和标记清除一致
- 清除阶段会执行整理移动对象位置
优点:解决空间碎片化
认识V8
- v8是js执行引擎
- 采用即时编译
- 内存设限
V8垃圾回收策略
- 采用分代回收思想
- 内存分为新生代和老生代
- 针对不同对象采用不同算法
V8中GC算法
- 分代回收
- 空间复制
- 标记清除
- 标记整理
- 标记增量
V8内存分配
- V8内存空间一分为二
- 小空间用于存储新生代对象(存活较短的对象)
新生代对象回收操作
- 回收过程采用复制算法和标记整理
- 新生代内存分为大小等大的两个内存
- 使用空间from,空闲空间to
- 活动对象存属于from空间
- 标记整理后将活动对象拷贝至to
- from与to交换空间完成释放
细节说明
- 拷贝过程可能存在晋升
- 晋升就是讲新生代转移至老生代
- 一轮GC还存活的新生代需要晋升
- to空间的使用率不能超过25%
- from与to完成交换操作
老生代对象
老生代对象存放入右侧老生代区域
64位操作系统1.4G,32位操作系统700M
老生代对象就是生存时间较长的对象
老生代回收实现
- 主要采取标记清除,标记整理,标记增量的算法
- 首先使用标记清除完成垃圾空间回收
- 采用标记整理进行空间优化
- 采用增量标记进行效率优化
细节对比
- 新生代区域垃圾回收使用空间换时间
- 老生代区域回收不适合复制算法
标记增量进行老生代垃圾回收
程序执行与垃圾回收同时进行
代码优化
- 慎用全局变量
- 缓存全局变量
- 通过原型对象附加方法
- 避免闭包陷阱
- 避免属性方法访问