浏览器的垃圾回收机制及原理
浏览器的垃圾回收机制
在 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,会使这部分内存永远不会被释放,即内存泄露。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2020-03-24 Echarts (option.yAxis) Y轴 的属性