首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Internet Explorer9 (IE9)是否在ajax / web服务调用期间泄漏?

Internet Explorer9 (IE9)是否在ajax / web服务调用期间泄漏?
EN

Stack Overflow用户
提问于 2011-11-08 18:35:07
回答 2查看 2.8K关注 0票数 1

我想我可能在Internet Explorer9中发现了一个相当严重的内存泄漏。似乎在对web服务执行AJAX调用时,IE9每次都会泄漏内存。事实上,它泄漏的内存似乎比涉及的传输大小更多。

如果您在任务管理器中查看IE9进程,您会看到内存使用率不断攀升(并且从不下降)。浏览器最终会使用大约1.5 at的内存,此时应用程序会崩溃。显然,如果您正在尝试开发一个AJAX web应用程序,而该应用程序需要一次运行几天,那么这将是一个问题。

这种行为在IE8、Chrome或火狐上不会发生。我还测试了禁用所有插件的IE9。

下面是一些可以重现该问题的AJAX 2.0代码(如果您希望尝试,您将需要MS ASP.NET ASP.NET扩展):

代码语言:javascript
复制
<%@ 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服务的代码:

代码语言:javascript
复制
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中发现了严重的内存泄漏?

向您致敬,詹姆斯

EN

回答 2

Stack Overflow用户

发布于 2012-10-03 05:16:57

我认为这个问题与响应的json解析有关。我遇到了一个类似的问题,并将其分离出来。

将dataType更改为“text”,您将不会看到更多的泄漏。我认为这与jQuery使用eval()进行json解析有关。

不管怎样,我找到了一个可以递归解析json的库json_parse.js。这对我在IE9上很有效。我没有在任何其他浏览器上测试它,只是因为我正在工作的网站只支持IE。

票数 1
EN

Stack Overflow用户

发布于 2011-11-18 12:27:52

这是Jquery导致的AJAX泄漏问题,我不知道Jquery的哪个部分导致了泄漏。对我来说,这发生在IE7和IE9中,虽然我没有费心去尝试使用IE8

证明:

代码语言:javascript
复制
$.ajax({
     url : '/sometestservice',
     dataType : "json",
     success : function () {}
});

每一秒重复这一步,很快就会消耗掉你的内存,现在试试这个

代码语言:javascript
复制
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解析泄漏了。

要重现,请重复此操作以查看泄漏

代码语言:javascript
复制
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()

这都是我说的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8049077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档