当前位置:网站首页>js垃圾回收机制
js垃圾回收机制
2022-08-03 00:35:00 【_语墨】
文章目录
1.内存泄漏
程序的运行需要内存。只要程序提出要求,操作系统或者运行时就必须供给内存。
对于持续运行的服务进程,必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。
也就是说,不再用到的内存,如果没有及时释放,就叫做内存泄漏。
1.1 哪些操作会造成内存泄漏:
1.1.1 意外的全局变量
function fn(){
a = "123"; //a成为一个全局变量,不会被回收
}
// 上面的写法等价于
function fn() {
window.a = '123'
由于没有使用var来声明,a变量会被创建成全局变量,会造成内存泄漏
解决方式:
在js文件开头添加 ‘use strict’,开启严格模式。
1.1.2 未清理的DOM元素引用
var a = document.getElementById('id');
document.body.removeChild(a);
不能回收,因为存在变量a对它的引用。虽然我们用removeChild移除了,但是还在对象里保存着#的引用,即DOM元素还在内存里面。
解决方法: a=null
1.1.3 被遗忘的定时器或者回调
解决方式: 当不需要interval或者timeout的时候,调用clearInterval或者clearTimeout
1.1.4 闭包
1.1.5 console.log
传递给console.log的对象是不能被垃圾回收,所以没有去掉console。log可能会存在内存泄漏
2.JavaScript中的垃圾回收
垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。
垃圾回收器会跟踪哪个变量没用,对于不再有用的变量打上标记,以备将来收回其内存,用于标记无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:标记清除和引用计数。
2.1 标记清除
JavaScript 中最常用的垃圾回收方式就是标记清除。
function test(){
var a = 10 ; // 被标记 ,进入环境
var b = 20 ; // 被标记 ,进入环境
}
test(); // 执行完毕 之后 a、b 又被标离开环境,被回收。
当变量进入环境时,就将这个变量标记为“进入环境”,而当变量离开环境时,则将其标记为“离开环境”。
垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去掉环境中变量的标记 以及被环境中的变量引用的变量(闭包)的标记。而在此之后在被加上标记的变量将被视为准备删除的变量。
最后,垃圾回收器完成内存清除功工作,销毁那些带标记的值并会搜狐他们所占用的内存空间。
到目前为止,IE9+、Firefox、Opera、Chrome、Safari 的 JS 实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同
2.2 引用计数
引用计数:跟踪记录每个值被引用的次数
当声明一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值被赋值给另一个变量,则该值的引用次数加1。
如果包含这个值引用的变量又取得了另一个值,则这个值的引用次数减1。
当垃圾回收器下次再运行时,就会释放那些引用次数为0的值所占用的内存。
function test() {
var a = {
}; // a 指向对象的引用次数为 1
var b = a; // a 指向对象的引用次数加 1,为 2
var c = a; // a 指向对象的引用次数再加 1,为 3
var b = {
}; // a 指向对象的引用次数减 1,为 2
}
遇到的问题:循环引用
对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的引用
function fn() {
var a = {
};
var b = {
};
a.pro = b;
b.pro = a;
}
fn();
a和b的引用次数都是2,fn执行完毕后,因为a和b的引用次数不为0,所以不会被垃圾回收内存,如果fn函数大量使用,就会造成内存泄漏。
边栏推荐
- 向往的生活
- flutter 每个要注意的点
- 微信小程序--》条件与列表渲染以及WXSS模板样式
- .NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)
- v-if、v-else、v-elseif v-show v-for
- Last Common Ancestor (LCA) Study Notes | P3379 【Template】Least Common Ancestor (LCA) Problem Solution
- 7.31
- 优秀论文以及思路分析02
- 如何修复 SAP UI5 aggregation with cardinality 0..1 相关的错误消息
- 开源聚力,共创未来 | 麒麟信安祝贺openKylin首个体验版正式发布!
猜你喜欢
随机推荐
吴恩达深度学习deeplearning.ai——第一门课:神经网络与深度学习——第二节:神经网络基础(上)
科捷智能冲刺科创板:年营收12.8亿 顺丰与日日顺是股东
优秀论文以及思路分析01
DB2数据库-获取表结构异常:[jcc][t4][1065][12306][4.26.14]CharConvertionException ERRORCODE=-4220,SQLSTATE=null
【QT】自定义工程封装成DLL并如何调用(带ui界面的)
8 个常用的 Wireshark 使用技巧,一看就会
线上交流丨稀疏神经网络:实践和理论(青源Talk第23期 汪张扬)
嵌入式开发:嵌入式基础——’ ’和” ”的区别
Day117. Shangyitong: Generate registered order module
torchvision.datasets.ImageFolder使用详解
php提示Array to string conversion
7.31
Servlet——请求(request)与响应(response)
心电记录电路设计(框图/波形以及信号放大器的选择)
v-if条件判断及v-show
vue3的keepAlive缓存组件
PAT甲级 1051 Pop Sequence
阿里云增强版实人认证--银行卡要素核验
全栈----跨域
Qt在选择MSVC 编译器的时候,无法识别出M_PI的问题处理