浏览器的垃圾回收机制及原理

浏览器的垃圾回收机制

在 JS 中创建一个变量的时候,系统会根据,变量的类型,自动为其分配对应的内存

基础类型 -> 栈内存,固定大小;
对象类型 -> 堆内存,根据需要分配大小,并给一个地址。

正常情况下,当这些变量不再被使用的时候,就会被回收,内存被释放。因为内存作为一种资源是有限的,一直被占用就会导致程序运行速度减慢甚至系统崩溃等严重后果。

垃圾回收原理浅析(垃圾回收机制是如何实现的、垃圾回收机制的实现原理)

现在各大浏览器通常采用的垃圾回收有两种方法:标记清除、引用计数。

1. 标记清除(mark and sweep)

大部分浏览器以此方式进行垃圾回收,当变量进入执行环境(函数中声明变量,执行时)的时候,垃圾回收器将标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。
标记的方式不定,可以是某个特殊位的反转或者维护一个列表等。
浏览器会在空闲的时间,删除这些不再在被使用的变量,释放内存资源。

2. 引用计数(reference counting)

另一种不太常见的垃圾收集策略叫做引用计数(reference counting)。引用计数的含义是跟踪记录每个值被引用的次数。

  当声明了一个变量并将一个引用类型值赋值该变量时,则这个值的引用次数就是1.如果同一个值又被赋给另外一个变量,则该值得引用次数加1。相反,如果包含对这个值引用的变量又取 得了另外一个值,则这个值的引用次数减 1。当这个值的引用次数变成 0时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次再运行时,它就会释放那 些引用次数为零的值所占用的内存。
  问题:循环引用。循环引用指的是对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的引用。请看下面这个例子

function loop() {
  var a = {};
  var b = {};
  a.prop = b;
  b.prop = a;
}

这中情况下每次调用 loop() 函数,a 和 b 的引用计数都是 2,会使这部分内存永远不会被释放,即内存泄露。

JS常见内存泄漏及解决方案解析

posted @ 2022-03-24 21:50  真的想不出来  阅读(1264)  评论(0编辑  收藏  举报