0

所以我最近设置了一个chrome扩展来刷新页面并调用我写的jsonp web服务,但是有一个内存泄漏。我搜索了所有的互联网寻找解决方案,似乎没有任何工作。我使用了简单的jQuery .ajax()调用,指定了“jsonp”,我使用了在http://code.google.com/p/jquery-jsonp/找到的jquery-jsonp,以及其他一些方法......我无法让内存泄漏消失。有人可以指点我的例子吗?我正在寻找什么,或者指向正确的方向?我只需要看到一个脚本不断调用jsonp调用而不会泄漏内存。jsonp内存泄漏

运行我的代码时,有没有泄露,直到我到达这个代码:

$.jsonp({ 
       url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
       success: function (returned, textStatus) { 
        callback({ "d": returned.d, "pickCount": pickCount }); 
       } 
      }); 

,如果我替换代码:callback({ "d": "1", "pickCount": pickCount }); 然后泄漏消失。

+0

你能发布你的代码吗?或者至少你在做什么代码明智的总体布局?另外,JavaScript端还是服务器端的内存泄漏?删除不相关的标签。 – strager 2010-08-12 04:59:18

+0

可能重复的[jsonp内存泄漏](http://stackoverflow.com/questions/3464766/jsonp-memory-leak) – 2010-08-12 05:01:16

+0

@Justin Niessner,@joelatdotzilla要求删除其他问题,并使用这一个代替。 – strager 2010-08-12 05:01:57

回答

2

如果你的代码的结构是这样的:

function callback() { 
    // (or similar, maybe with `setTimeout`) 

    $.jsonp({ 
    url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
    success: function (returned, textStatus) { 
     callback({ "d": returned.d, "pickCount": pickCount }); 
    } 
    }); 
} 

然后正在创建递归success功能。调用堆栈可能看起来像这样:

> callback 
    > $.jsonp 
    > NEW success 
     > callback 
     > $.jsonp 
      > NEW success 
      > ... 

日益栈,在每次迭代时被创建的新success功能,并且的success函数本身的整个范围内(包括returnedtextStatus,和callback的上下文)最终会导致运行时必须记录但基本上未使用的对象。

另一种方法是有callback范围之外的辅助功能:

function callCallback(returned, textStatus) { 
    callback({ "d": returned.d, "pickCount": pickCount }); 
} 

function callback() { 
    // (or similar, maybe with `setTimeout`) 

    $.jsonp({ 
    url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
    success: callCallback 
    }); 
} 

如果需要,使功能专用。例如:

var callback = (function() { 
    function callCallback(returned, textStatus) { 
    callback({ "d": returned.d, "pickCount": pickCount }); 
    } 

    function callback() { 
    // (or similar, maybe with `setTimeout`) 

    $.jsonp({ 
     url: serviceUrl + "/AddPick?callback=?&" + jQuery.param(json), 
     success: callCallback 
    }); 
    } 

    return callback; 
})();