GC( Garbage Collection ),GC执行时,中断代码,停止其他操作。执行阶段遍历所有对象,对于不可访问的对象进行回收。该机制执行操作耗时100ms左右。V8引擎中使用两种优化方法:
- 分代回收;
- 增量GC;
- 目的是通过对象的使用频率、存在时长区分新生代与老生代对象。多回收新生代区(young generation),少回收老生代区(tenured generation),减少每次需遍历的对象,从而减少每次GC的耗时。
- 把需要长耗时的遍历、回收操作拆分运行,减少中断时间,但是会增大上下文切换开销.
回收方法
(1)引用计次
当对象被引用次数为0时,就被回收。潜在的一个问题是:循环引用时,两个对象都至少被引用了一次,将不能自动被回收。所以导致,我们常讲的内存泄露。
(2)标记清除
这是当前主流的GC算法,V8里面就是用这种。当对象,无法从根对象沿着引用遍历到,即不可达(unreachable),进行清除。对于上面的例子,fn() 里面的 a 和 b 在函数执行完毕后,就不能通过外面的上下文进行访问了,所以就可以清除了。
解释型语言(例如 JavaScript)来说, 通过词法分析 -> 语法分析 -> 语法树,就可以开始解释执行了。
语法分析成 AST (Abstract Syntax Tree)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。