zoukankan      html  css  js  c++  java
  • Javascript垃圾回收浅析

        接上篇《JS特性性能缺陷及JIT的解决方案》,这里总结下的Javascript垃圾回收机制。

    一. 枚举Javascript引擎分配内存的场景:

    1. Object

    new Object();
    new MyConstructor();
    { a: 4, b: 5 }
    Object.create();

    2. 数组

    new Array();
    [ 1, 2, 3, 4 ];

    3. 字符串

    new String(“hello hyddd”);
    “<p>” + e.innerHTML + “</p>”

        随带一说,javascript的字符串和.Net一样,使用资源池和copy on write方式管理字符串。

    4. 函数对象

    var x = function () { ... }
    new Function(code);

    5. 闭包

    function outer(name) {
    var x = name;
    return function inner() {
      return “Hi, “ + name;
    }
    }

        闭包和prototype不一样,以上函数为例,当调用outer时,会生成并返回一个对象(隐含变量x),每次调用都创建一个,而prototype则是每次都返回同一个而对象(即:无论多少次调用,只创建一个对象)。

    二. GC方案

        相对其他语言的复杂的GC方案,Javascript的GC相对还是比较简单的。

    1. Javascript引擎基础GC方案是(simple GC):mark and sweep(标记清除),即:

    (1)遍历所有可访问的对象。

    (2)回收已不可访问的对象。

    2. GC的缺陷

        和其他语言一样,javascript的GC策略也无法避免一个问题:GC时,停止响应其他操作,这是为了安全考虑。而Javascript的GC在100ms甚至以上,对一般的应用还好,但对于JS游戏,动画对连贯性要求比较高的应用,就麻烦了。这就是新引擎需要优化的点:避免GC造成的长时间停止响应。

    3. GC优化策略

        David大叔主要介绍了2个优化方案,而这也是最主要的2个优化方案了:

    (1)分代回收(Generation GC)

        这个和Java回收策略思想是一致的。目的是通过区分“临时”与“持久”对象;多回收“临时对象”区(young generation),少回收“持久对象”区(tenured generation),减少每次需遍历的对象,从而减少每次GC的耗时。如图:

        1

        这里需要补充的是:对于tenured generation对象,有额外的开销:把它从young generation迁移到tenured generation,另外,如果被引用了,那引用的指向也需要修改。

    (2)增量GC

        这个方案的思想很简单,就是“每次处理一点,下次再处理一点,如此类推”。如图:

        2

        这种方案,虽然耗时短,但中断较多,带来了上下文切换频繁的问题。

    4. 总结

        因为每种方案都其适用场景和缺点,因此在实际应用中,会根据实际情况选择方案。

        比如:低 (对象/s) 比率时,中断执行GC的频率,simple GC更低些;如果大量对象都是长期“存活”,则分代处理优势也不大。

    作者:hyddd
    出处:http://www.cnblogs.com/hyddd/
    本文版权归作者所有,欢迎转载,演绎或用于商业目的,但是必须说明本文出处(包含链接)。

  • 相关阅读:
    Java程序设计11——异常处理
    Hive安装及配置
    zookeeper集群安装(转)
    Linux网络服务管理命令
    Linux网络配置常用命令
    IP地址及子网掩码计算
    linux ftp、sftp、telnet服务开通、更改Orale最大连接数
    SQL多表连接
    用css伪类实现提示框效果
    关于DOM操作的性能优化
  • 原文地址:https://www.cnblogs.com/hyddd/p/2908598.html
Copyright © 2011-2022 走看看