垃圾回收机制
Chao 工程师
  1. 项目中,如果存在大量不被释放的内存(堆/栈/上下文),页面性能会变得很慢。当某些代码操作不能被合理释放,就会造成内存泄漏。我们尽可能减少使用闭包,因为它会消耗内存。

  2. 浏览器垃圾回收机制/内存回收机制:

浏览器的Javascript具有自动垃圾回收机制(GC:Garbage Collecation),垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。

标记清除:在js中,最常用的垃圾回收机制是标记清除:当变量进入执行环境时,被==标记为“进入环境”==,当变量离开执行环境时,会被==标记为“离开环境”==。垃圾回收器会==销毁那些带标记的值==并回收它们所占用的内存空间。

谷歌浏览器:==“查找引用”==,浏览器不定时去查找当前内存的引用,如果没有被占用了,浏览器会回收它;如果被占用,就不能回收。

IE浏览器:==“引用计数法”==,当前内存被占用一次,计数累加1次,移除占用就减1,减到0时,浏览器就回收它。

总结一下:

有两种垃圾回收策略:

  • 标记清除:标记阶段即为所有活动对象做上标记,清除阶段则把没有标记(也就是非活动对象)销毁。
  • 引用计数:它把对象是否不再需要简化定义为对象有没有其他对象引用到它。如果没有引用指向该对象(引用计数为 0),对象将被垃圾回收机制回收。

标记清除的缺点:

  • 内存碎片化,空闲内存块是不连续的,容易出现很多空闲内存块,还可能会出现分配所需内存过大的对象时找不到合适的块。
  • 分配速度慢,因为即便是使用 First-fit 策略,其操作仍是一个 O(n) 的操作,最坏情况是每次都要遍历到最后,同时因为碎片化,大对象的分配效率会更慢。
  1. 优化手段:内存优化 ; 手动释放:取消内存的占用即可。

(1)堆内存:fn = null 【null:空指针对象】

(2)栈内存:把上下文中,被外部占用的堆的占用取消即可。

  1. 内存泄漏:

在 JS 中,常见的内存泄露主要有 4 种,==全局变量、闭包、DOM 元素的引用、定时器==

 Comments