很多文章的三色标记法,增量标记法,新生代老生代,引用计数法,标记回收法。很容易给最开始学习垃圾回收算法的朋友搞混。文章适合有一部分基础,但是要把算法搞混的朋友们。这篇文章带大家梳理一下本人的思路,如果有问题欢迎指正:
首先我们要知道js在v8引擎下执行的,我们将内存分为了新生代和老生代,为啥要这么分?这么分是怎么发展来的
最开始可以说是引用计数法,但是引用计数方法会有很大的问题:
1.循环引用
2.需要很大空间放置计数器
接下来就是标记清除法,也会出现问题:
那就是,标记清除完后会出现不连续空间导致效率变低
然后出现了标记清除整理算法,将不连续的空间进行了整理。
优化到这里了,效率就已经比较高了。那么如果继续优化??
试想一下,我们上面所说的垃圾清理算法在每次垃圾回收时都要检查内存中所有的对象,这样的话对于一些大、老、存活时间长的对象来说同新、小、存活时间短的对象一个频率的检查很不好,因为前者需要时间长并且不需要频繁进行清理,后者恰好相反,怎么优化这点呢???分代式就来了,就出现了新生代和老生代!!!!!!
都有优化到这里了,还能优化吗????
我们先要了解一个概念 全停顿(Stop-The-World),我们都知道 JavaScript 是一门单线程的语言,它是运行在主线程上的,那在进行垃圾回收时就会阻塞 JavaScript 脚本的执行,需等待垃圾回收完毕后再恢复脚本执行,我们把这种行为叫做 全停顿。比如一次 GC 需要 60ms ,那我们的应用逻辑就得暂停 60ms 。如果对于游戏这种对流畅度要求很高的场景,那么60ms远远不够看
那么怎么继续优化??