·
垃圾回收与常见GC算法
-
引用计数算法
应用引用计数器设置引用数,判断当前引用数是否为0,引用关系改变时修改引用数字,当引用数字为0时立即回收
优点:
- 发现垃圾时立即回收
- 最大限度减少程序暂停,减少程序卡顿时间
缺点:
- 无法回收循环引用的对象
- 时间开销大,资源消耗较大
-
标记清除算法
核心:分标记和清除两个阶段完成
遍历所有对象找标记活动对象
遍历所有对象清除没有标记对象
回收相应的的空间
优点:
- 可回收循环引用的对象
缺点:
- 容易产生碎片化空间,浪费空间
- 不会立即回收垃圾对象
-
标记整理算法
是标记清除的增强,标记阶段的操作与标记清除一致,清除阶段会先执行整理,移动对象位置
优点:
- 减少碎片化空间
缺点:
- 不会立即回收垃圾对象
-
标记增量算法:
在v8引擎的老生代存储区中效率优化垃圾回收时使用,将程序执行和垃圾回收时间轮询,在开始一段时间程序执行后停止程序执行,转而开始遍历对象进行标记,在之后将程序执行和标记分配不同时间段交叉进行完成增量标记,然后完成对象清除,继续执行程序
优点: 效率高
v8引擎的垃圾回收
采用即时编译
内存设限(32bit 800M; 64bit 1.5G)
垃圾回收策略:
- 采用分代回收思想
- 内存分新生代、老生代
- 针对不同对象采用不同算法
v8常用 GC算法:
- 分代回收
- 空间复制
- 标记清除
- 标记整理
- 增量标记
v8新生代存储区垃圾回收:
- v8内存一分为二,小空间存储新生代对象(32M/64bit | 16M/32bit)
- 新生代:指存活时间较短的对象
回收实现:
- 回收过程采用复制算法+标记整理
- 新生代内存区分为两个等大小空间
- 使用空间为From, 空闲空间为To
- 活动对象存储于From空间
- 标记整理后将活动对象拷贝至To
- From与To交换空间完成释放
回收细节说明:
- 拷贝中可能出现晋升(将新生代对象移动至老生代)
- 一轮GC还存活的新生代需要晋升
- To空间的使用率超过25%则晋升
v8老生代存储区垃圾回收:
- (1.4G/64bit | 700M/32bit)
- 老生代对象:指存活时间较长的对象
回收实现:
- 回收过程采用标记清除+标记整理+增量标记算法
- 先用标记清除完成垃圾空间的回收
- 采用标记整理进行空间优化(晋升过程空间不够时)
- 采用增量标记算法进行效率优化
回收细节对比:
- 新生代空间换时间
- 老生代不适合复制算法(数据过多)