【问题标题】:How to free memory from a looped object如何从循环对象中释放内存
【发布时间】:2010-10-30 06:41:12
【问题描述】:

我正在尝试动态更新使用 Prototip 和 Prototype 制作的工具提示。我尝试这样做的方式可能不是最好的方式(所以如果你知道更好的方式会有所帮助),但我能想到的唯一方法是将javascript保存在 div 元素中并更新div 元素内的 javascript 以更新工具提示。但是,这似乎是内存泄漏,因为每次更新 javascript 时,都会创建一个新的 Tip 对象并将其存储在内存中。如果没有更好的方法,我该如何清除内存?

我制作了这个简单的脚本来测试内存泄漏,现在我需要弄清楚如何制作它以便在这个示例中修补内存泄漏。

for (i=0; i<1000; i++) {
    $('testdiv').update("<script type='text/javascript'> new Tip('chips_tip', 'Your Chips', {style: 'creamy',stem: 'topLeft',hook: { mouse: true, tip: 'topLeft' },offset: { x: 10, y: 16 },delay: 0.04,width: 85}); <\/script>");
}

工具提示的 javascript 通常是这样的:

new Tip('element', "Description", {
    style: 'creamy',
    stem: 'topLeft',
    hook: { mouse: true, tip: 'topLeft' },
    offset: { x: 10, y: 16 },
    delay: 0.04,
    width: 85
});

【问题讨论】:

    标签: javascript memory-leaks javascript-framework


    【解决方案1】:

    似乎新的 Tip 构造可以将元素而不是工具提示文本作为参数。您可能想尝试使用它。我没有这样做,所以你必须自己尝试。首先,创建工具提示布局(包含工具提示文本的 div 标签)并像往常一样设置样式。将此 div 的样式属性设置为“display:none”。然后尝试像这样创建提示:

    new Tip('source', $('tooltip_container'));
    

    然后您可以使用以下方法更改工具提示的文本:

    $('tooltip_container').update('new tooltip text');
    

    将工具提示构造分配给全局空间中的变量是不够的,因为在我看来 prototip 将它自己的工具提示 html 内容插入到 dom 中。我的猜测是,每次您调用“新提示”时,您都会在 dom 中添加额外的 html。这些对象然后引用 dom 节点,因此它们永远不会被垃圾收集。您应该很容易使用您的测试代码和萤火虫检查 dom。

    最后的选择是查看 prototip 源代码,看看它是否有某种 setTooltipText 函数。然后你也许可以做这样的事情:

    var tooltip = new Tip('element', 'text');
    // snip
    tooltip.setText('some new text');
    

    如果这没有帮助,只需向 prototip 的作者发送电子邮件即可。我相信他会很乐意提供帮助。

    【讨论】:

    • 谢谢你,我会试试这个,如果可行,我会报告。
    【解决方案2】:

    看起来这实际上是 Prototype 中的内存泄漏。 According to this,泄漏在 1.6.1 中修复

    【讨论】:

      【解决方案3】:

      通过实例化“提示”对象,您实际上执行了构造函数调用,例如简单的函数调用,它相应地处理和更新可视元素,但是一旦这个对象没有被任何变量引用,它应该被垃圾收集器收集。如果您想确定可以执行以下操作:

      var tip = new Tip( whatever);
      // before next update do delete tip;
      

      【讨论】:

        【解决方案4】:

        正如您所注意到的,简单地实例化一个新的 Tip 将意味着一个新的 Tip 对象被创建并存储在内存中。

        要解决这个问题,您需要将 Tip 分配给全局范围内的唯一变量。 即实例化变量“tooltip”,然后在您的例程中使用“tooltip = new Tip”(这将允许一次仅使用 1 个工具提示,我认为这是您想要的,因为只能显示一个)。垃圾收集应该负责其余的工作。

        【讨论】:

          猜你喜欢
          • 2011-11-14
          • 2011-07-21
          • 2019-08-08
          • 1970-01-01
          • 1970-01-01
          • 2014-12-30
          • 2014-05-24
          • 1970-01-01
          • 2021-08-11
          相关资源
          最近更新 更多