我想我可能在Internet Explorer9中发现了一个相当严重的内存泄漏。似乎在对web服务执行AJAX调用时,IE9每次都会泄漏内存。事实上,它泄漏的内存似乎比涉及的传输大小更多。
如果您在任务管理器中查看IE9进程,您会看到内存使用率不断攀升(并且从不下降)。浏览器最终会使用大约1.5 at的内存,此时应用程序会崩溃。显然,如果您正在尝试开发一个AJAX web应用程序,而该应用程序需要一次运行几天,那么这将是一个问题。
这种行为在IE8、Chrome或火狐上不会发生。我还测试了禁用所有插件的IE9。
下面是一些可以重现该问题的AJAX 2.0代码(如果您希望尝试,您将需要MS ASP.NET ASP.NET扩展):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebServiceLeakTest._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Web Service Leak Test</title>
<script type="text/javascript" src="jQuery-1.7.js"></script>
<script type="text/javascript" src="json2.js"></script>
<script type="text/javascript">
$(document).ready(function()
{
resultsArea = jQuery("#results");
resultsArea.html(iterationCount);
GetData();
});
var resultsArea;
var iterationCount = 0;
var useJQuery = false;
var waitInterval = 1500;
function GetData()
{
if(useJQuery)
{
$.ajax(
{
url: "TestWebService.asmx/GetSomeData",
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: ReceiveData,
error: ReceiveError
});
}
else
{
WebServiceLeakTest.TestWebService.GetSomeData(ReceiveData, ReceiveError);
}
}
function ReceiveData(data)
{
resultsArea.html(iterationCount++);
setTimeout(GetData, waitInterval);
}
function ReceiveError(error)
{
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="TestWebService.asmx" />
</Services>
</asp:ScriptManager>
<div id="results">
!
</div>
</form>
</body>
</html>您将从代码中注意到,从web服务调用返回的结果甚至没有存储在javascript客户端中;它只是在web服务返回时更新计数器。
此外,在使用ServiceReference中自动生成的客户端存根或使用jQuery (将'useJQuery‘更改为true)时,也会出现此问题。我还尝试使用json2.js的jQuery和jQuery进行(反)序列化,但这并没有明显的区别。
以下是测试web服务的代码:
using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Collections.Generic;
using System.Web.Script.Services;
namespace WebServiceLeakTest
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class TestWebService : System.Web.Services.WebService
{
const int NUMBER_OF_RECORDS = 10;
[WebMethod]
public List<TestData> GetSomeData()
{
List<TestData> data = new List<TestData>(NUMBER_OF_RECORDS);
for (int i = 0; i < NUMBER_OF_RECORDS; i++)
{
TestData record = new TestData(
Guid.NewGuid().ToString(),
Guid.NewGuid().ToString(),
Properties.Resources.LorumIpsum);
data.Add(record);
}
return data;
}
}
}正如您可能看到的,它并没有做太多特殊的事情。它返回一些包含3个字符串属性的哑对象。这些哑巴对象中的每一个都填充了2个GUID和大约70KB的任意文本。因此,每次调用web服务都会返回~700KB。
如果您尝试这样做,您将需要增加web.config文件中的最大JSON传输长度。
例如:
我已经搜索了网络,MSDN等,但没有找到任何有用的或关于这个问题的信息。
还有没有人遇到过这种情况?我做错了什么吗?其他人能重现这个问题吗?我是否在IE9中发现了严重的内存泄漏?
向您致敬,詹姆斯
发布于 2012-10-03 05:16:57
我认为这个问题与响应的json解析有关。我遇到了一个类似的问题,并将其分离出来。
将dataType更改为“text”,您将不会看到更多的泄漏。我认为这与jQuery使用eval()进行json解析有关。
不管怎样,我找到了一个可以递归解析json的库json_parse.js。这对我在IE9上很有效。我没有在任何其他浏览器上测试它,只是因为我正在工作的网站只支持IE。
发布于 2011-11-18 12:27:52
这是Jquery导致的AJAX泄漏问题,我不知道Jquery的哪个部分导致了泄漏。对我来说,这发生在IE7和IE9中,虽然我没有费心去尝试使用IE8
证明:
$.ajax({
url : '/sometestservice',
dataType : "json",
success : function () {}
});每一秒重复这一步,很快就会消耗掉你的内存,现在试试这个
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){};
xmlhttp.open("GET","/sometestservice",true);
xmlhttp.send();因此,我建议您编写自己的ajax代码。
更新:它证明jQuery中的ajax代码没有泄漏,但是itsJSON解析泄漏了。
要重现,请重复此操作以查看泄漏
var text = "{";
for (var i = 0; i < 1000; i++) {
text += "\"abc" + i + "\":10000000000000,";
}
text = text.substring(0, text.length -1);
text += "}";
( new Function( "return " + text) )();我不知道这是否会有帮助,但我通过使用https://github.com/douglascrockford/JSON-js中的json_parse.js覆盖了jQuery中的JSON解析,修复了我的webapp中的漏洞。这是来自Douglas Crockford库,请注意,json2 (非常流行)是有漏洞的,因为它使用了eval()
这都是我说的。
https://stackoverflow.com/questions/8049077
复制相似问题