zoukankan      html  css  js  c++  java
  • js的垃圾收集机制以及写代码如何处理

    程序都自己的内存,一旦内存过多就会清楚以前的缓存。所以,在写代码的时候,不要仅仅只会推变量到栈中,还要会将变量从栈中释放。

    那么问题来了,我们应该如何将内存从栈中释放呢?

    要释放变量,那就要从javaScript的垃圾收集机制开始学习了。

    javaScript的垃圾收集机制有两种

    1.标记清除

    这是JavaScript最常用的方法。这个方法就是当一个变量进入环境中,设置一个标记位给变量,当他离开环境时,反转这个标志位。然后垃圾收集机制在间隔一段时间重复执行,他会回收那写标志位被反转的变量。

    2.引用计数

    这个方法就是给进入环境的变量加个数量来标志他被引用的次数,当被引用的时候这个次数加1,相反,如果包含这个变量引用的变量又取其他的值,则次数减1。然后垃圾收集机制在间隔一段时间重复执行,他会回收那个标志次数为0 的变量。

    ie在之前的版本,垃圾回收机制是根据内存分配量运行的,当环境中存在 256 个变量、4096 个对象、64K 的字符串任意一种情况的时候就会触发垃圾回收器工作。这不符合开发,万一项目大了怎么操作呢?

    因此之后改版就是触发条件不再是固定的,而是动态修改的,初始值和IE6相同,如果垃圾回收器回收的内存分配量低于程序占用内存的 15%,说明大部分内存不可被回收,设的垃圾回收触发条件过于敏感,这时候把临界条件翻倍,如果回收的内存高于 85%,说明大部分内存早就该清理了,这时候把触发条件置回。

    说了这么多,还没又讲如何手动回收变量?

    function example() {
      return 1;  
    }
    var num = example();
    // 人工解除example的引用
    num = null;

    不过,解除一个值的引用并不意味着自动回收改值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

    以上是es5的方法。因为ES6 考虑到了这一点,推出了两种新的数据结构:WeakSet 和 WeakMap。它们对于值的引用都是不计入垃圾回收机制的,所以名字里面才会有一个"Weak",表示这是弱引用。

    const wm = new WeakMap();
    
    const element = document.getElementById('example');
    
    wm.set(element, 'some information');
    wm.get(element) // "some information"

    上面代码中,先新建一个 Weakmap 实例。然后,将一个 DOM 节点作为键名存入该实例,并将一些附加信息作为键值,一起存放在 WeakMap 里面。这时,WeakMap 里面对element的引用就是弱引用,不会被计入垃圾回收机制。

    也就是说,DOM 节点对象的引用计数是1,而不是2。这时,一旦消除对该节点的引用,它占用的内存就会被垃圾回收机制释放。Weakmap 保存的这个键值对,也会自动消失。

    基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。

    想要深入学习的童鞋,可以去看阮老师的es6。

  • 相关阅读:
    SSM框架搭建
    UML——类图
    javascript中的闭包(Closure)的学习
    JS和jQuery中ul li遍历获取对应的下角标
    jquery中防止冒泡事件
    chouTi
    DjangoForm 之创建FORM模板进行验证
    django学习日记-cookie
    同步锁
    进程线程
  • 原文地址:https://www.cnblogs.com/tzzf/p/9131254.html
Copyright © 2011-2022 走看看