标记清除
思想
- 时间定时器循环触发
- 变量所有变量,将不是垃圾的(可达的)标记,删去所有没有标记的垃圾 缺点
- 造成空间零碎化,降低分配速度
V8对其的优化##
长久块
堆内存分为两块,用两个垃圾回收器管控。
新生块反复筛查回收,多次筛查存活的变量放入长久块,长久块的筛查周期较长。
新生块大小较小,长久块较大。
新生块平分为空闲区与使用区,空闲区保持为空,使用区快满时把不是垃圾的部分移入空闲区,然后清空使用区。此时空闲区与使用区互换身份,同时把存活较长的变量加入长久块。
增量标记
原先的垃圾回收操作内存变量使得与主线程互斥。产生堵塞。
为了产生过长阻塞,将标记过程分为多个步骤穿插进行,本次标记在上次结果上增加后续标记。
三色标记法
白色:没有被标记
灰色:当前节点被标记,但子节点还未处理
黑色:该节点以及子节点全部被标记
从根节点开始标为灰色,开始从此广搜。子代处理结束灰色变黑,子代变灰色,没有子代的变为黑色或者保持白色。
知道灰色消失,只剩黑色或白色则开始回收操作。
惰性清理
再内存空间充足时,垃圾回收机制总是在闲时运行,当内存告急时启用阻塞并行回收机制。
并发回收器
使用情况暂未了解
会破坏单线程机制,单线程就是为了避免加锁等多线程操作复杂性。 ---?
将回收操作放在单独的线程来避免阻塞主线程,但是加锁。只进行标记阶段,清楚阶段仍然使用并行阻塞回收机制。
引用计数
思想
- 每个变量有一个值为该变量被引用的次数,当没有被引用时回收。
- 可以监听到该回收的时机,在满足条件时立刻回收,不需要时候让任务执行阻塞。 缺点
- 计数器占据空间大的嘛离谱
使用情况
老IE
闭包与垃圾回收
- 闭包形成的私有作用域中保存的变量即使时基本数据类型也保存在堆内存中,因为栈内存出栈顺序固定,在作用域不再使用时总是整块出栈。
- 从理论讲所有函数都有自己的私有作用域那么所有函数都是闭包。
- 但一般认为闭包是创建他的上下文销毁但是他依然被别人引用所以仍然存在,并且由于闭包函数的作用域链中含有刚才被销毁的,创建闭包函数的作用域上下文所以也保护了上下文词法环境不被回收。
- 闭包的创建上下文一般也是一个函数,这个函数通过参数或者其他途径有一个常量,并且这个常量被他内部闭包函数调用,所以这个函数中的值被闭包保护了起来。
- 基本数据类型传递是直接传递值,所以可以直接让一个函数接收参数并保存这个函数的引用来保存一个变量。