js[垃圾回收机制]探索

简介

js的垃圾回收机制是指js的执行环境周期性的对代码进行检索寻找不在使用的变量或者函数内容,然后将其内存释放的一种机制,目的是为了防止内存泄漏。

变量生命周期

js 有全局变量和局部变量两个类型

  • 局部变量一般情况下在局部作用域中,当函数执行完毕的时候,就会将其释放
  • 全局变量一般情况下会持续到浏览器关闭为止,因此会暂用大量内存,所以尽量避免使用全局变量。

回收原理

js通用的垃圾回收有两种方式:标记清除(mark and sweep)、引用计数(reference counting)

1.标记清除(mark and sweep)

大部分浏览器以此方式进行垃圾回收,当变量进入执行环境(函数中声明变量)的时候,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”,在离开环境之后还有的变量则是需要被删除的变量。标记方式不定,可以是某个特殊位的反转或维护一个列表等。
垃圾收集器给内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量的标记。在此之后再被加上的标记的变量即为需要回收的变量,因为环境中的变量已经无法访问到这些变量

2.引用计数(reference counting)

机制就是跟踪一个值的引用次数,当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,当这个变量指向其他一个时该值的引用次数便减一。当该值引用次数为0时就会被回收。
引用计数方式对循环引用问题可能会找出内存泄漏

减少JavaScript中的垃圾回收

1.为了最大限度的实现对象的重用,应该像避免使用new语句一样避免使用{}来新建对象,可以使用函数构造器的形式创建对象。
2.将[]赋值给一个数组对象,是清空数组的捷径(例如: arr = [];),但是需要注意的是,这种方式又创建了一个新的空对象,并且将原来的数组对象变成了一小片内存垃圾!实际上,将数组长度赋值为0(arr.length = 0)也能达到清空数组的目的,并且同时能实现数组重用,减少内存垃圾的产生
3.循环查找之类的尽可能在找到之后就进行结束,避免在进行后续的执行。
4.主动释放一些用完了的变量,如:定时器变量
5.重复利用方法等,

猜你喜欢

转载自blog.csdn.net/lxy869718069/article/details/106802383