【问题标题】:jQuery Ajax & Memory leak questionjQuery Ajax 和内存泄漏问题
【发布时间】:2010-11-18 15:08:29
【问题描述】:

我有一个执行定期扫描操作的网络应用程序,并在特定页面上显示这些操作的状态(以及任何以前完成的操作)。我有一个使用 jQuery 发送的 Ajax 请求,它返回我当前所在的同一页面,在给定时间变量(上次更新)的情况下进行了修改,以仅包括正在运行的扫描和任何最近完成的扫描。

显然,在将此打开过夜后(这不是一个正常的用例),在 IE8 上返回了“第 112 行内存不足”(在第 112 行没有任何值得注意的内容)。我正试图找出我做错了什么,以及它可能在哪里泄漏。

我的问题是:因为我正在重新加载同一个页面,但只取其中的一部分,“准备好的”处理程序是否会重新运行或其他什么?在大多数情况下,活动操作表将是空的,所以我不会不断增加表的大小或其他明显的东西。

function updateActiveScanList()
 {
    $.ajax({  
        method: "POST",
        url: "ScanList.action",
        data: { updatedTime: $('#updatedTime').val() },
        success: function(data) { 


        // Update the active scan list.
        $('#activescans').html( $("#activescans", data) );

        // the recent scans table update requires more massaging, omitted for brevity,
        // since there's nothing else done there, this happens even if nothing else is 
        // ever inserted.
    });
}
$(document).ready(

  function(){
      setInterval( updateActiveScanList, 30000 );
  } 
);

【问题讨论】:

  • 仅供参考,将字符串传递给setTimeout()setInterval() 被认为是不好的做法(因为您基本上是eval()-ing)。你应该传递函数:setInterval(updateActiveScanList, 30000);
  • 真正的问题可能是在 #activescans 中替换 HTML 时引起的,如果您将数据附加到生成的 HTML,那么每次运行 AJAX 请求,之前在#activescans 中的 DOM 元素被破坏,但相关数据可能保持不变。请参阅此堆栈溢出:jQuery memory leak with DOM removal

标签: javascript jquery memory-leaks


【解决方案1】:

您可以使用sIEve 之类的工具来检测吞噬您记忆的事物。
我猜使用的 DOM 节点的数量(它们不需要成为文档树的一部分)会随着每次操作而增加。

如果您在 DOM 操作部分忘记 jQuery 会是最好的,jQuery 使用的方法被称为容易出现此问题,而它们部分使用了一些“肮脏”的东西,如 innerHTML。

您能否举例说明您喜欢在#activescans 中包含哪些内容?

【讨论】:

  • 嗯,这绝对表明我使用的孤立 DOM 节点的数量在每个请求中增加了 24,我的代码中没有任何明显的迹象表明我将如何摆脱它们,或者为什么它们'没有被清理。有什么建议吗?
  • 建议:也许(见我编辑的帖子)。这取决于您想在那里展示什么,以及是否可以以一种干净的方式构建响应,仅使用本机 DOM 方法。
  • 在大多数情况下,返回的 DOM 在 99% 的情况下几乎不包含任何内容。如果没有运行,它只包含一个

    Active Scans

    There are no active scans.

    ,但其中也有一个
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多