垃圾回收机制

垃圾回收机制(GC:Garbage Collection)与内存泄露

 JS中有自动垃圾收集机制,执行环境会负责管理代码执行过程中的内存。

 机制原理是: 找出不再使用的变量,释放它所占用的内存。垃圾收集器会按固定的时间间隔(代码中预定的收集时间)**周期性**地执行这一操作。
  • 标记清除

    • 当变量进入环境(在函数中声明一个变量), 将这个变量标记为“进入环境”。当变量离开环境时,将其标为“离开环境”
    • 可以使用任何方式去标记变量。可以用一个“进入环境”的变量列表或者一个“离开环境”的变量列表来跟踪变量的变化。但关键在于如何标记。
    • 在运行的时候,将存储在内存中的所有变量加上标记。去掉环境中的变量以及被变量引入的变量的标记。这样以后,还有标记的变量就是要清除的变量。
    • 也就是作用域中的执行上下文对象。例如函数中的变量,预解析时变量进入。函数执行完了,对象出栈,标记为离开环境,等待清除。
  • 引用计数(只是知道,内部实现还是不了解)

    • 含义就是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,该值的引用次数为1。 如果同一个值又被赋给另一个变量, 则该值的引用次数加1.
    • 相反,如果包含这个值引用的变量又取到另一个值,则这个值的引用次数减1 .当这个值引用次数为0, 就会释放它所占的内存。
    • 问题:循环引用
     function problem(){
       var objectA = new Object();
       var objectB = new Object();
    
       objectA.someOtherObject = objectB;
       objectB.anotherObject = objectA;
       //通过各自的属性,相互引用。这两个对象的引用次数都是2.
     }
    
  • 内存泄漏

    • 因为不是所有无用对象内存都可以被回收的,那当不再用到的对象内存,没有及时被回收时,我们叫它内存泄漏(Memory leak).
    • 不正当的使用闭包可能会造成内存泄漏。
        function f() {
            var num = 1;
            return function() {
                return num;
            }
        }
        var f = f();
        console.log(f());
        //需要手动清除 f = null .否则会造成内存泄漏
      
      更多内存泄漏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值