课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
垃圾回收机制是大多数软件编程开发程序员都应该熟练掌握并应用的一个编程开发知识点,下面我们就通过案例分析来简单了解一下,垃圾回收基础知识分享。
一、代际假说
在垃圾回收中有一个重要术语:代际假说(TheGenerationalHypothesis),这个假说不仅仅适用于JavaScript,同样适用于大多数的动态语言,Java、Python等。
代际假说表明很多对象在内存中存在的时间很短,即从垃圾回收的角度来看,很多对象在分配内存空间后,很快就变得不可访问。
二、两种垃圾回收器
在V8中,会将堆分为两块不同的区域:新生代(YoungGeneration)和老生代(OldGeneration)。
新生代中存放的是生存时间短的对象,大小在1~8M之间;老生代中存放的生存时间久的对象。
对于这两块区域,V8会使用两个不同的垃圾回收器:
副垃圾回收器(Scavenger)主要负责新生代的垃圾回收。如果经过垃圾回收后,对象还存活的话,就会从新生代移动到老生代。
主垃圾回收器(FullMark-Compact)主要负责老生代的垃圾回收。
无论哪种垃圾回收器,都会有一套共同的工作流程,定期去做些任务:
标记活动对象和非活动对象,前者是还在使用的对象,后者是可以进行垃圾回收的对象。
回收或者重用被非活动对象占据的内存,就是在标记完成后,统一清理那些被标记为可回收的对象。
整理内存碎片(不连续的内存空间),这一步是可选的,因为有的垃圾回收器不会产生内存碎片。
三、副垃圾回收器
V8为新生代采用Scavenge算法,会将内存空间划分成两个区域:对象区域(From-Space)和空闲区域(To-Space)。
副垃圾回收器在清理新生代时,会先将所有的活动对象移动(evacuate)到连续的一块空闲内存中(这样能避免内存碎片)。
然后将两块内存空间互换,即把To-Space变成From-Space。
接着为了新生代的内存空间不被耗尽,对于两次垃圾回收后还活动的对象,会把它们移动到老生代,而不是To-Space。
后是更新引用已移动的原始对象的指针。上述几步都是交错进行,而不是在不同阶段执行。
四、主垃圾回收器
主垃圾回收器负责老生代的清理,而在老生代中,除了新生代中晋升的对象之外,还有一些大的对象也会被分配到此处。
主垃圾回收器采用了Mark-Sweep(标记清除)和Mark-Compact(标记整理)两种算法,其中涉及三个阶段:标记(marking),清除(sweeping)和整理(compacting)。
(1)在标记阶段,会从一组根元素开始,递归遍历这组根元素。其中根元素包括执行堆栈和全局对象,浏览器环境下的全局对象是window,Node.js环境下是global。
在这个遍历过程中,会追溯每一个指向JavaScript对象的指针,将其标记为可访问,同时追溯对象中每一个属性的指针。
这个过程会一直持续至找到并标记运行时可到达的所有对象,而那些追溯不到的就是垃圾数据。
(2)在清除阶段,会将非活动对象占用的内存空间添加到一个叫空闲列表的数据结构中。
空闲列表中的内存块由大小来区分,这是为了方便以后需要分配内存时,可以快速的找到大小合适的内存空间并分配给新的对象。
(3)在整理阶段,会让所有活动的对象都向一端移动,然后直接清理掉端边界以外的内存,如下图所示。
五、垃圾回收机制
在本节开头提到了并行(parallel)、增量(incremental)和并发(concurrent)三种垃圾回收机制。
(1)并行是指主线程和协助线程同时执行同样的工作,这仍然是一种全停顿。
但垃圾回收所耗费的时间等于总时间除以参与的线程数量(加上一些同步开销)。
(2)增量是指主线程间歇性的去做少量的垃圾回收,而不是花一整段时间去执行。
虽然没有减少主线程暂停的时间,但JavaScript的执行都能得到及时的响应。
(3)并发是指主线程一直执行JavaScript,而辅助线程在后台执行垃圾回收,这种实现起来难,需要处理很多复杂的场景。
例如JavaScript堆上的任何东西都可以随时更改,使之前所做的工作无效。况且现在有读/写竞争,辅助线程和主线程有可能同时在更改同一个对象。
V8在新生代垃圾回收中会使用并行清理,每个协助线程会将所有的活动对象都移动到To-Space。
主垃圾回收器主要使用并发标记,当堆的动态分配接近高阈值时,会启动并发标记任务。
V8会利用主线程上的空闲时间主动的去执行垃圾回收,在Chrome中,大约有16.6毫秒的时间去渲染动画的每一帧。
如果动画提前完成,那么就能在下一帧之前的空闲时间去触发垃圾回收。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。