【问题标题】:Resolving Javascript/jQuery memory leak issues in $.post解决 $.post 中的 Javascript/jQuery 内存泄漏问题
【发布时间】:2011-12-12 09:35:35
【问题描述】:

我在尝试使用 jQuery-1.7.1 在 web 应用程序中跟踪内存泄漏时遇到问题。该应用程序正在向服务器发出 POST 请求,以使用精心制作的表单检索一些搜索结果。在我消除了大部分 js 代码(用于泄漏跟踪目的)之后,裸函数如下所示:

$(function() {
  // bind the search action
  $('#search-button').unbind('click').click(function() { doSearch(); });
});

function doSearch() {
  // get the query string from the search form
  var query = $('#search-form').serialize();

  // perform search and render results
  $.post('/search', query, function(data){
    // nothing here now (trying to debug)
    data = null;
  }, 'json');

  query = null;
}

我可以看到,每次我点击搜索按钮时,内存消耗都会额外增加约 1MB,尽管实际上它什么也没做。这是一个真正的问题,因为该应用程序具有“自动刷新”搜索模式,该调用大约每分钟进行一次 - 所以如果保持活动状态,它会在一段时间后堵塞浏览器。

从服务器返回的data 对象包含一个表示成功/失败的布尔值,以及一个要呈现的 html 字符串(如果成功则相当大,大约 1Mb 左右):

data = {
  success : true/false,
  html    : "<div id='results'>.....</div>"
}

由于我要在回调的实际正文中执行 zilch,我怀疑这个 data 并没有从范围中消除,而是在内存中聚合。我尝试在回调结束时将其设置为null,但这并没有成功。这已在 chromefirefox(两者的早期和最新版本)上进行了测试。我错过了什么吗?任何想法都会有所帮助 - 谢谢。

【问题讨论】:

  • 你用的是什么浏览器?这个doSearch函数是怎么调用的?
  • 如何检索内存消耗?内存也可以用于浏览器缓存,在这种情况下它不会称之为内存泄漏。你可以发送一些 nocache-headers 来避免这种情况。
  • @DarinDimitrov 我用过 Firefox/Chrome。 doSearch() 函数可以通过按钮调用,也可以通过每隔 60 秒左右调用一次的“设置即忘记”间隔来调用。
  • @Dr.Molle 我已经使用了一些痕迹——Linux 上的 htop 和 Windows 上的 perfmon + task-manager。在这两个方面,我都看到该进程的内存消耗在每个请求上都会显着增加。如何确定它实际上是缓存还是泄漏?谢谢。

标签: javascript jquery performance memory-leaks


【解决方案1】:

确实没有可靠的方法来强制 javascript 进行垃圾收集。

您可以尝试将此行与旨在释放内存的另一行一起添加:

query = null;
delete query;

【讨论】:

    【解决方案2】:

    JSON 格式需要为每个键加上引号

    试试

    data = {
      "success" : true/false,
      "html"    : "<div id='results'>.....</div>"
    }
    

    我说的是服务器端字符串输出

    【讨论】:

    • 在这种情况下,服务器是基于 python 的,并返回一个格式正确的 json 对象。我只是在写作中偷工减料:)
    猜你喜欢
    • 2012-08-19
    • 2010-12-11
    • 2012-05-23
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多