【问题标题】:Google Chrome Heap Snapshots (closure), (array), (system), (compiled code) under programmer control?谷歌浏览器堆快照(闭包),(数组),(系统),(编译代码)在程序员控制下?
【发布时间】:2012-05-27 12:38:50
【问题描述】:

我注意到我在标题中提到的属性在我的页面中显着增加(尤其是“(关闭)”)。

此操作系统和/或浏览器是否受控?我能做些什么吗?

究竟是什么(闭包)、(数组)、(编译代码)、(系统)等?

另外,(array) 和 'Array' 有什么区别?

【问题讨论】:

    标签: javascript memory google-chrome-devtools


    【解决方案1】:

    关于你的问题:

    问:究竟是什么(闭包)(数组)(编译代码),(系统)等?

    an article by Addy Osmani 的这个 sn-p 可能会有所帮助:

    • (全局属性) – 全局对象(如“窗口”)与其引用的对象之间的中间对象。如果一个对象是使用构造函数 Person 创建的并且由一个全局对象持有,则保留路径看起来像 [global] > (global property) > Person。这与对象直接相互引用的规范形成对比。出于性能原因,我们有中间对象。全局对象会定期修改,属性访问优化对非全局对象做得很好,但不适用于全局对象。

    • (roots) – 保留树视图中的根条目是具有对选定对象的引用的实体。这些也可以是引擎为其自身目的创建的引用。引擎缓存了哪些引用对象,但所有这些引用都是弱引用,并且不会阻止对象被收集,因为没有真正的强引用。

    • (closure) – 通过函数闭包对一组对象的引用计数

    • (array, string, number, regexp) – 对象类型列表,其属性引用数组、字符串、数字或正则表达式

    • (已编译代码) – 简单地说,与已编译代码相关的所有内容。脚本类似于函数,但对应于主体。 SharedFunctionInfos (SFI) 是位于函数和编译代码之间的对象。函数通常有上下文,而 SFI 没有。

    • HTMLDivElement、HTMLAnchorElement、DocumentFragment 等 – 对代码引用的特定类型的元素或文档对象的引用。

    整篇文章包含许多其他关于堆分析的有价值的信息:http://addyosmani.com/blog/taming-the-unicorn-easing-javascript-memory-profiling-in-devtools

    还有你的另一个问题:

    问:另外,(array)和'Array'有什么区别?

    根据 Addy 的描述,我的解释是这样的:(array) 是具有引用实际数组的属性的对象(任何类型)的集合。相比之下,Array 是实际 Array 对象的列表。

    【讨论】:

    • Philip,您在这里解释了 (array) 和 Array 之间的区别。我不明白你对(数组)的解释。你能不能再详细点,因为我不像大多数开发人员那么快。任何帮助将不胜感激。
    【解决方案2】:

    闭包是一个能够引用在其直接作用域之外声明的数据的函数。

    这是一个例子:

    var closure = (function() {
       var a = "some data";
       var b = "something else...";
       return function Closure() {
          // this function retains references to a and b.
       }
    })();
    

    在 Web 开发中最常见的闭包方式是将事件侦听器附加到 dom 节点。

    例如:

    $.ready(function() {
       var $elems = $("selector");
       var tools = new Tools();
       $elems.mousedown(function() { // <-- this has created a closure
          // We can refer to $elems and tools in here
          // and so as long as this function is held on to so are those variables to which
          // it has access
       });
    });
    

    如果您验证这一点,实际上会看到(关闭)计数上升

    1. pop open chrome
    2. 进行堆转储
    3. 运行: function DistinctName() {} function DistinctName2() {}

      在 JavaScript 控制台中

    4. 进行另一个堆转储

    5. 从最底部的堆转储选项中选择“比较”。

    您会看到DistinctNameDistinctName2(closure) 类别下显示为新的闭包。

    v8 有一个“JIT”编译器,所以我假设(编译的)是指 JIT 编译的源代码。

    我只能猜测(数组)和(系统)。

    【讨论】:

    • 那么(闭包)构建最有可能是事件处理程序?
    • 好吧,如果没有看到你的代码就很难判断。您可以为您的事件处理函数命名,例如:$el.mousedown(function mousedownHandler() {}),然后它们应该在闭包列表中显示它们的名称。这将帮助您追踪正在发生的事情。堆转储比较视图对于查找新分配也非常有用。
    • 你能追踪到你的泄漏吗?
    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 2010-09-07
    • 1970-01-01
    • 2020-06-30
    • 2014-06-18
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多