gpt4 book ai didi

jquery - 为什么jquery泄漏内存如此严重?

转载 作者:IT王子 更新时间:2023-10-28 23:28:24 29 4
gpt4 key购买 nike

这是我上周发布的一个问题的后续: Simple jQuery Ajax call leaks memory in Internet Explorer

我喜欢 jquery 语法及其所有不错的功能,但我一直在处理通过 ajax 调用自动更新表格单元格的页面泄漏内存。

所以我创建了两个简单的测试页面进行实验。两个页面每 0.1 秒执行一次 ajax 调用。每次成功的 ajax 调用后,计数器都会增加并更新 DOM。脚本在 1000 次循环后停止。

一个使用 jquery 来进行 ajax 调用和更新 DOM。另一个使用 Yahoo API 的 ajax 并执行 document.getElementById(...).innerHTML 来更新 DOM。

jquery 版本严重泄漏内存。滴水运行(在带有 IE7 的 XP Home 上),它从 9MB 开始到大约 48MB 结束,内存一直线性增长。如果我注释掉更新 DOM 的行,它仍然以 32MB 结束,这表明即使是简单的 DOM 更新也会泄漏大量内存。非 jquery 版本开始和结束大约 9MB,不管它是否更新 DOM。

是否有人对导致 jquery 泄漏如此严重的原因有一个很好的解释?我错过了一些明显的东西吗?是否有我不知道的循环引用?还是 jquery 只是有一些严重的内存问题?

这里是泄漏(jquery)版本的来源:

<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
</script>
<script type="text/javascript">
var counter = 0;
leakTest();
function leakTest() {
$.ajax({ url: '/html/delme.x',
type: 'GET',
success: incrementCounter
});
}
function incrementCounter(data) {
if (counter<1000) {
counter++;
$('#counter').text(counter);
setTimeout(leakTest,100);
}
else $('#counter').text('finished.');
}
</script>
</head>
<body>
<div>Why is memory usage going up?</div>
<div id="counter"></div>
</body>
</html>

这是非泄漏版本:

<html>
<head>
<script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/yahoo/yahoo-min.js"></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/event/event-min.js"></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/connection/connection_core-min.js"></script>
<script type="text/javascript">
var counter = 0;
leakTest();
function leakTest() {
YAHOO.util.Connect.asyncRequest('GET',
'/html/delme.x',
{success:incrementCounter});
}
function incrementCounter(o) {
if (counter<1000) {
counter++;
document.getElementById('counter').innerHTML = counter;
setTimeout(leakTest,100);
}
else document.getElementById('counter').innerHTML = 'finished.'
}
</script>
</head>
<body>
<div>Memory usage is stable, right?</div>
<div id="counter"></div>
</body>
</html>

最佳答案

我最初的想法是它与jquery ajax方法的方式有关:

一个。创建循环引用,对 IE 尤其不利

b.在内部对象上创建属性,这些属性由于创建方式和 DontDelete 属性的设置而无法删除。更多信息请参见:http://perfectionkills.com/understanding-delete/

无论哪种方式,都会阻止垃圾收集器拾取垃圾,这将导致失控的内存泄漏,尤其是在该可疑函数频繁执行的情况下。

关于jquery - 为什么jquery泄漏内存如此严重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2450761/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com