私はInternet Explorer 9でかなりのメモリリークを発見したかもしれないと思います.AJAXをWebサービスに呼び出すと、IE9は毎回メモリをリークしているようです。実際には、関連する転送のサイズよりも多くのメモリがリークするようです。ajax/webサービス呼び出し中にInternet Explorer 9(IE9)がリークしますか?
IE9のプロセスをタスクマネージャで見ると、メモリ使用量が上昇する(決して落ちない)ことがわかります。ブラウザは最終的に〜1.5GBのメモリを使用し、その時点でアプリケーションがクラッシュします。あなたが一度に数日間稼働し続けることを意図したAJAX Webアプリケーションを開発しようとしているなら、明らかにこれは問題になります。
IE8、Chrome、Firefoxではこの現象は発生しません。私もIE9をすべてのアドオンを無効にしてテストしました。
以下は(あなたがそれを試してみたい場合は、MS ASP.NET AJAXの拡張が必要になります)問題を再現することができますいくつかのASP.NET 2.0のコードです:
<%@ 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に変更)。 jQueryを使った(de)シリアライゼーションのためにjson2.jsで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転送長を増やす必要があります。
< jsonSerialization maxJsonLength = "10000000" />
私はウェブ、MSDNなどを検索しましたが、この問題に関して有益で有益な情報は見つかりませんでした。
他に誰かがこれに遭遇しましたか?私は何か間違っているのですか?他の誰かがこの問題を再現できますか? IE9でメモリリークが検出されましたか?
よろしく、 ジェームズ
asp.netで生成されたクライアント側のプロキシも使用すると起こりますので、この場合はjQueryとは関係ありません。たとえば、WebServiceLeakTest.TestWebService.GetSomeData(ReceiveData、ReceiveError);を実行する場合。また、この問題はIE7やIE8では私にとっては起こりません。IE9だけです。 – JamesEngica
お返事ありがとうございます。 – JamesEngica
ちょっと@JamesEngicaこれのための解決策を見つけたことがありますか?私はWin 7 IE 9で同じページを表示するのと同じ問題を抱えています。私は2秒ごとに更新されたデータでテーブルを塗りつぶす繰り返しのajax呼び出しを持っています。私はWin 7 FirefoxやWin XP IE 8では問題ではないメモリリークだと思っていました。私のテストでは、jquery ajax呼び出しを書き換えて、代わりにXMLHttpRequestを使用して、リークがまだ発生していることがわかりました。 – bwmfsu