[垃圾回收 | 青训营笔记]

93 阅读2分钟

[垃圾回收 | 青训营笔记]

内存泄漏和垃圾回收机制

内存泄漏

一个对象不再被使用,但是它的内存却没有被释放,会导致程序运行时,内存约占越大,可能导致系统崩溃,服务器宕机

垃圾回收机制

原因

  • Js中,字符串、数组、对象没有固定大小,需要动态分配存储,所以解释器就会分配内存存储这些数据,但是当解释器消耗完所有内存时,系统就会崩溃
  • 内存泄漏

垃圾回收策略

标记清除

一开始就把所有活动对象做上标记,清楚的时候把没有标记的(就是没有活动的对象)销毁

缺点:

  • 内存碎片化:空闲内存不连续,很驳杂,分配大内存时可能找不到合适的块

  • 分配速度慢:即便使用First-fit策略,操作任然是一个O(n)操作,最坏情况是每次都要遍历到最后,同时因为碎片化,大对象的分配效率会更慢

解决以上的缺点可以使用 标记整理(Mark-Compact)算法 标记结束后,标记整理算法会将活着的对象(即不需要清理的对象)向内存的一端移动,最后清理掉边界的内存

引用计数

把回收对象定义为有没有其他对象引用它,如果引用数为0(没有引用指向该对象),就被回收

缺点:

  • 需要一个计数器,所占内存空间大,因为我们也不知道被引用数量的上限
  • 解决不了循环引用导致的无法回收问题
    • IE 6、7JS对象和DOM对象循环引用,清除不了,导致内存泄露

V8 的垃圾回收机制也是基于标记清除算法,不过对其做了一些优化

  1. 针对新生区采用并行回收
  2. 针对老生区采用增量标记惰性回收