Chrome的JS引擎v8将堆内存回收机制分为两类,新生代的回收机制和老生代的回收机制。
-
只要是经历过一次Scavenge算法回收的就可以晋升为老生代内存的对象。(对于内存空间比较大的,就不适合采用Scavenge算法)
-
老生代内存中的垃圾回收采用Mark-Sweep(标记清除)和Mark-Compact(标记整理)的策略。
-
Mark-Sweep(标记清除):分为标记阶段和清除阶段。 首先它会遍历堆上的所有的对象,分别堆他们打上标记;然后在代码执行过程结束之后,对使用过的变量取消标记;在清除阶段,就会把还有标记的进行整体清除,从而释放内存空间。
-
Mark-Compact(标记整理):通过标记清除之后,还是会出现内存碎片的问题,该问题就需要通过标记整理策略来解决。
-
-
内存泄露:是指Javascript中,已经分配堆内存地址的对象由于长时间未释放或无法释放,造成了长期占用内存,使内存浪费,最终会导致运行的应用相应速度变慢以及最终崩溃的情况。
可能造成内存泄漏的原因:
-
过多的缓存未释放;
-
闭包太多未释放;
-
定时器或者回调太多未释放;
-
太多无效的DOM未释放;
-
全局变量太多未被释放。
优化方案:
-
减少不必要的全局变量,使用严格模式避免意外创建全局变量;
-
在使用完数据或定时器后,及时解除引用
-
组织好代码逻辑,避免死循环等造成浏览器卡顿、崩溃等问题;
-