作者回复: 总结很好,还可以通过Chrome开发者工具中的Performance来观察。
作者回复: 新生区和老生区标记过程是同一个过程,之后新生代把存活的数据移动到空闲区,老生代把死去的对象加到空闲列表中。
作者回复: 是的 栈中的过期数据直接通过esp给抹掉,效率非常高。
作者回复: 会的,副垃圾回收器执行速度快,而且容易满,所以回收频率会比主垃圾回收器高。
作者回复: JavaScript中的原始字符串是不可变的(immutable),也就是说,一旦一个字符串创建了,它在内存中的值就不可能改变,这和其他语言是有区别的。
所以当你调用trim方法后,v8引擎返回给你的是一个新字符串,并不是之前的字符串了。
作者回复: 比如全局window对象看成是一个树状结构,垃圾回收时,V8会先遍历这颗树,能遍历到的元素说明还存活的,标记为活动对象!没有被标记到的说明已经没有被引用了。
同时V8还维护了一个空闲列表,也就是没有被使用的空闲空间列表,垃圾清理过程就是把没有标记的添加到空闲列表中!
这样就完成了“标记-清除”操作
作者回复: 这是一个很好的方法
作者回复: 声明变量是在编译阶段完成的,这时赋值语句还没执行!
比如 var a = 6
首先编译阶段确定有变量a了,并给a赋值undefined;
接下来执行代码,在执行过程中,会将6赋给a,这时候a等于6!
由于6是原生类型,通常情况下,会在栈上分配该变量!
如果 var a = Object
将对象赋给a时,在编译阶段 a依然等于undefined,在执行过程中,会在堆中创建一块内存,存放Object的值,然后栈中有个指向堆中Object地址的指针
作者回复: 对,没有被引用的闭包会被自动回收,不过如果没用的闭包还保存在全局变量中,依然会内存泄漏!
作者回复: 标记清除和标记整理可以看成是垃圾回收的两个阶段吧,v8在实现垃圾回收过程中,两种算法都用上了。
作者回复: 现代虚拟机都是抄来抄去的
作者回复: 没有引用的对象是不会重新被使用的了,能使用的都是能查到的
作者回复: 不全没关系,新产生的垃圾下次再回收,分配内存使用空闲列表里面的。
作者回复: v8虽然借鉴了Java的垃圾回收器,但是v8新生代只有两个区,幸存对象会被打上标记!