【发布时间】: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,但这并没有成功。这已在 chrome 和 firefox(两者的早期和最新版本)上进行了测试。我错过了什么吗?任何想法都会有所帮助 - 谢谢。
【问题讨论】:
-
你用的是什么浏览器?这个
doSearch函数是怎么调用的? -
如何检索内存消耗?内存也可以用于浏览器缓存,在这种情况下它不会称之为内存泄漏。你可以发送一些 nocache-headers 来避免这种情况。
-
@DarinDimitrov 我用过 Firefox/Chrome。
doSearch()函数可以通过按钮调用,也可以通过每隔 60 秒左右调用一次的“设置即忘记”间隔来调用。 -
@Dr.Molle 我已经使用了一些痕迹——Linux 上的
htop和 Windows 上的 perfmon + task-manager。在这两个方面,我都看到该进程的内存消耗在每个请求上都会显着增加。如何确定它实际上是缓存还是泄漏?谢谢。
标签: javascript jquery performance memory-leaks