js垃圾清除机制(标记清楚,引用计数)

17 篇文章 0 订阅
15 篇文章 0 订阅

内存泄漏

不再使用到的内存,没有及时释放,就是内存泄露
所以为了避免手动的释放内存,就有了垃圾请除机制
代码回收规则如下:

1.全局变量不会被回收。

2.局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西都会被销毁。

3.只要被另外一个作用域所引用就不会被回收 (闭包中引用的变量不会被回收)

垃圾回收的方法

1,标记清除

垃圾回收器会给在内存中的变量都做上标记,然后它会去除在环境中的变量和被环境中变量引用的变量(闭包)的标记,在这之后的被标记的变量就是需要清除的变量了。之后垃圾回收器将会回收这些变量所占的内存了
在这里插入图片描述

2,引用计数

引用计数就是追踪每个值被引用的次数,当引用计数为0时,就会回收他所占用的内存。
在这里插入图片描述

使用引用计数会有一点小问题

就是在循环引用的对象时,这些对象的引用计数永远都不可能是1,所以回收不了这些对象,就会有内存泄漏
循环引用的对象使用 JSON.stringify 为什么会报错?
对象相互引用,JSON.tostringify 无法将一个无限引用的对象序列化为 JOSN 字符串。

针对这种问题的一种解决方案是去除这种循环引用
例如:

var c = JSON.decycle(a)

这样就去除了a对象的循环引用,如果想恢复原本的循环引用对象a,可以调用retrocycle方法

var a = JSON.retrocycle(a)

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值