垃圾回收机制(GC)

779 词

javascript的垃圾回收机制

背景

JavaScript 是使用垃圾回收的语言,也就是说**执行环境**负责在代码执行时管理内存。在` C `和` C++`等 语言中,跟踪内存使用对开发者来说是个很大的负担,也是很多问题的来源。JavaScript 为开发者卸下 了这个负担,通过**自动内存管理**实现内存分配和闲置资源回收。

实现思路

基本思路很简单:确定哪个变量不会再 使用,然后释放它占用的内存。这个过程是周期性的,即垃圾回收程序每隔一定时间(或者说在代码执 行过程中某个预定的收集时间)就会自动运行。垃圾回收过程是一个近似且不完美的方案,因为某块内存是否还有用,属于“不可判定的”问题,意味着靠算法是解决不了的

垃圾回收程序必须跟踪记录哪个变量还会使用,以及哪个变量不会再使用,以便回收 内存。如何标记未使用的变量也许有不同的实现方式。不过,在浏览器的发展史上,用到过两种主要的标记策略:`标记清理`和`引用计数`。

实现方法

标记清除法(常用)

首先它会遍历堆内存上所有的对象,分别给它们打上标记,然后在代码执行过程结束之后,对所使用过的变量取消标记。在清除阶段再把具有标记的内存对象进行整体清除,从而释放内存空间。

  • 垃圾收集器在运行时会给内存中的所有变量都加上一个标记
  • 然后从各个根对象开始遍历,把还在被上下文变量引用的变量标记去掉标记
  • 清理所有带有标记的变量,销毁并回收它们所占用的内存空间
  • 最后垃圾回收程序做一次内存清理

引用计数法

引用计数是一种不常见的垃圾回收策略,思路是对每个值都记录其的引用次数,具体如下

  • 当变量进行声明并赋值后,值的引用数为1
  • 当同一个值被赋值给另一个变量时,引用书+1
  • 当保存该值引用的变量被其它值覆盖时,引用数-1
  • 当该值的引用数为0时,表示无法再访问该值了,此时就可以放心的将其清除并回收内存

如何解决内存泄漏问题

全局变量

被遗忘的定时器和回调函数

闭包

Dom引用

留言