likes
comments
collection
share

垃圾回收机制——拒绝“八股文”

作者站长头像
站长
· 阅读数 17

什么是垃圾回收机制

在计算机的世界里,无用的数据会被称为“垃圾”,这些垃圾会占用计算机的内存空间,如果不及时进行清理,系统的性能可能会受到负面影响。因此,我们需要一种机制来清除这些无用的数据,这就是垃圾回收机制

在JS中,垃圾回收机制是自动进行的,也就是说,当一个对象没有被引用时,垃圾回收机制会自动回收它所占用的内存空间。这个过程是由JS引擎内部的垃圾回收器(garbage collector,简称“GC”)完成的

常见的垃圾回收算法

引用计数

引用计数是最简单的垃圾回收算法,它的原理是通过计算对象被引用的次数,来判断该对象是否为垃圾。当一个对象没有被任何变量或其他对象引用时,它的引用计数就为零,这时垃圾回收器就可以将其回收

但是,引用计数有一个明显的缺点,那就是无法处理循环引用。当两个对象互相引用对方时,它们的引用计数永远不可能为零,导致垃圾回收器无法回收它们,从而造成内存泄漏

标记清除

标记清除算法是一种更先进的垃圾回收算法,它的原理是通过标记可达对象,从而清除无法到达的对象。具体步骤如下:

(1)遍历所有对象,标记属于可达对象

(2)从根节点开始,递归遍历可达对象,对遍历过的对象进行标记

(3)遍历整个堆,将没有标记的对象回收

标记清除算法可以解决循环引用的问题,但是它也有一个明显的缺点,在执行标记和清除的过程中,会停止整个应用程序的运行。这种暂停的时间取决于垃圾回收器需要清除的内存数量和硬件性能等因素。

增量标记

增量标记算法是改进了标记清除算法。它的原理是将整个垃圾回收过程分段执行,每执行完一段就让应用程序有机会执行一段代码,这样可以将整个垃圾回收过程分散到不同时间段中执行,减少了应用程序卡顿的时间

浏览器的垃圾回收机制

现代浏览器一般采用增量标记算法来处理内存垃圾回收。当一个网页被打开时,浏览器会创建一个堆内存(heap),用于存储所有JS对象。垃圾回收器会定期检查堆内存中的对象是否处于可达状态

当一个对象不再被引用时,它就可以被垃圾回收器回收。垃圾回收器会遍历堆内存中的所有对象,并将所有未被引用的对象标记为“待删除”,然后进行一次垃圾回收操作,将所有标记为“待删除”的对象从堆内存中删除,从而释放它们所占用的内存空间

如何避免内存泄露

尽管JS垃圾回收机制可以自动回收内存,但仍然存在内存泄漏的风险。内存泄漏是指程序中已经不再需要的内存没有被及时释放,从而导致系统的性能和稳定性受到影响。让我们来看看避免内存泄露的方法:

  • 及时清除事件监听器和定时器:在JS中添加事件监听器或设置定时器后,及时清除它们,否则它们会一直存在于内存中,导致内存泄漏
  • 避免循环引用:使用闭包时,需要小心可能产生循环引用的代码。一般来说,在使用完一个闭包后,需要将其解除绑定以便它可以被垃圾回收器回收
  • 慎用全局变量:全局变量会一直存在于内存中,因此我们应当根据情况多用局部变量
  • 避免过度使用DOM:频繁操作DOM也是导致内存泄露的原因之一

后语

垃圾回收机制虽然auto,我们使用时也要小心哦

我是前端霸哥,愿你的代码中没有bug 写的不好的地方,欢迎各位小伙伴批评指正

转载自:https://juejin.cn/post/7245753944180260923
评论
请登录