我创建了一个网页,每秒进行一次Ajax调用。在Internet Explorer 7中,它严重泄漏内存(大约15分钟内20 MB)。
该程序非常简单。它只是运行一个进行Ajax调用的JavaScript函数。服务器返回一个空字符串,而JavaScript代码则不执行任何操作。我setTimeout
过去每秒钟运行一次该函数,并且我正在使用Drip来观看该事件。
来源如下:
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout('testJunk()',1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){}
});
setTimeout('testJunk()',1000)
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
如何堵塞这种泄漏?我有一个真正的应用程序,它会以这种方式更新大表,但是如果不加注意,它将占用数GB的内存。
编辑 :好的,所以在提出一些好的建议之后,我将代码修改为:
<html>
<head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.4.2');
google.load('jqueryui', '1.7.2');
</script>
<script type="text/javascript">
setTimeout(testJunk,1000);
function testJunk() {
$.ajax({ url: 'http://xxxxxxxxxxxxxx/test', // The url returns an empty string
dataType: 'html',
success: function(data){setTimeout(testJunk,1000)}
});
}
</script>
</head>
<body>
Why is memory usage going up?
</body>
</html>
不过,这似乎没有什么区别。我没有对DOM做任何事情,如果我注释掉Ajax调用,则内存泄漏将停止。因此,看起来泄漏完全在Ajax调用中。jQuery
Ajax是否会固有地创建某种循环引用?如果是,我如何释放它?顺便说一下,它不会在Firefox中泄漏。
有人建议在另一台VM上运行测试,然后查看结果是否相同。我没有设置另一台VM,而是发现了一台运行带有Internet Explorer 8的XP
Home的笔记本电脑。它出现了同样的问题。
我尝试了一些旧版本的jQuery并获得了更好的结果,但是直到我放弃jQuery中的Ajax并使用了更传统(更丑陋)的Ajax时,问题才完全消失。
问题似乎出在Internet Explorer中的jQuery 1.4,以及程度较小的1.2和1.3版本中。
1.4.0、1.4.1和1.4.2均出现严重的内存泄漏。
1.2.3、1.2.6、1.3.0、1.3.1和1.3.2都显示出小得多的泄漏(10分钟后大约100 KB)。
我还尝试了一种以更传统的方式调用Ajax的程序版本:
<html>
<head>
<script language="javascript" type="text/javascript">
function getHTTPObject() {
var xmlhttp;
/*@cc_on
@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
@else
xmlhttp = false;
@end @*/
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try {
xmlhttp = new XMLHttpRequest();
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType("text/xml");
}
} catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
var ajaxObject = getHTTPObject();
setTimeout(testJunk,1000);
function testJunk() {
ajaxObject.open('POST', 'http://XXXXXXXXXXXXXXX/delme2', true);
ajaxObject.onreadystatechange = handleAjaxResponse;
ajaxObject.send(null);
}
function handleAjaxResponse() {
if (ajaxObject.readyState==4) {
setTimeout(testJunk,1000);
}
}
</script>
</head>
<body>
<div id="test">Why is memory usage going up?</div>
</body>
</html>
这完全消除了泄漏。
因此,看来我必须重复我的Ajax调用丑陋的旧方法,直到jQuery专家们解决了这个问题。
问题内容: 我编写了一个聊天框小部件,它每秒运行一次ajax调用,以获取已发布的新消息。问题在于它正在泄漏内存,仅在打开大约15分钟后便崩溃了我的浏览器(Firefox)。 可能是我,因为我是相对的新手,所以我确定自己错过了某些事情,或者没有设置变量等。 有人可以看一下我的(基本)代码,看看是否可以发现发生内存泄漏的地方以及我做错了什么?我是否需要取消设置某些变量或其他内容? 非常感谢! 问题答案
问题内容: 导致Java内存泄漏的最简单方法是什么? 问题答案: 除非您执行以下操作,否则您实际上无法在Java中“泄漏内存”: 实习生字符串 生成类 jni调用的本机代码中的泄漏内存 在一些被遗忘或晦涩的地方保存对您不想要的事物的引用。 我认为您对最后一种情况感兴趣。常见方案是: 侦听器,尤其是内部类 缓存。 一个很好的例子是: 构建一个Swing gui,它可以启动数量不限的模态窗口; 让模态
我尝试用一个大表(大约一万条记录)中的记录填充JdbcRowSet。我尝试了两个变体(参见下面的代码): 创建连接对象,使用JdbcRowSetImpl(connection)实例化,在循环中执行查询。 使用JdbcRowSetImpl(DriverManager.GetConnection(“jdbc:....”)实例化,在循环中执行查询。 第一个变体会导致内存泄漏,直到堆满为止。第二个变体没有
问题内容: 我有一个在django中运行的小型多线程脚本,随着时间的流逝,它开始使用越来越多的内存。将其保留一整天会消耗大约6GB的RAM,我开始进行交换。 在http://www.lshift.net/blog/2008/11/14/tracing-python-memory- leaks 之后,我将其视为最常见的类型(仅使用800M内存): 这没有什么奇怪的。我现在应该怎么做才能帮助调试内存问
问题内容: 我多次问到这个问题。有什么好的答案 问题答案: Java中会不会发生内存泄漏? 答案是,这取决于您正在谈论的是哪种内存泄漏。 经典C / C ++内存泄漏是在应用程序或对象完成使用后忽略时发生的,并且会泄漏。循环引用是这种情况的一个子案例,其中应用程序很难知道何时使用/ ,因此忽略了这样做。相关问题是应用程序在释放对象后使用对象,或尝试释放对象两次。(您可以将后者称为内存泄漏,或者仅是
问题内容: 有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。 我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。 问题答案: 阅读这篇文