2011-11-08 26 views
1

私は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でメモリリークが検出されましたか?

よろしく、 ジェームズ

答えて

0

これは、jQueryのAJAXによって引き起こされるリークの問題で、私はしかし、漏れの原因となっているのjQueryの一部を知りません。

$.ajax({ 
    url : '/sometestservice', 
    dataType : "json", 
    success : function() {} 
}); 

繰り返し、これは今、すぐに十分なあなたのRAMを食べるようになる毎秒この

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(); 
を試してみてください。

を証明するのに、私はIE8をしようとする気didntは、私のためにIE7とIE9で起こりました

だから、自分のAjaxコードを書くといいでしょう。


更新: それはjQueryのdidntはリークでAjaxコードを消すが、itsJSONの解析を行います。まあ、これが役立つかどうかはわからないが、私はhttps://github.com/douglascrockford/JSON-jsからjson_parse.jsを使用して、jQueryのでJSONの構文解析をオーバーライドすることによって、私のWebアプリケーションでのリークを修正漏れ

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))(); 

を見るためにこれを繰り返し再現する

。 これはDouglas Crockfordの図書館です。json2(かなり普及しています)はeval()を使用しているため、漏れていることに注意してください。

これは私のものです。

+0

asp.netで生成されたクライアント側のプロキシも使用すると起こりますので、この場合はjQueryとは関係ありません。たとえば、WebServiceLeakTest.TestWebService.GetSomeData(ReceiveData、ReceiveError);を実行する場合。また、この問題はIE7やIE8では私にとっては起こりません。IE9だけです。 – JamesEngica

+0

お返事ありがとうございます。 – JamesEngica

+0

ちょっと@JamesEngicaこれのための解決策を見つけたことがありますか?私はWin 7 IE 9で同じページを表示するのと同じ問題を抱えています。私は2秒ごとに更新されたデータでテーブルを塗りつぶす繰り返しのajax呼び出しを持っています。私はWin 7 FirefoxやWin XP IE 8では問題ではないメモリリークだと思っていました。私のテストでは、jquery ajax呼び出しを書き換えて、代わりにXMLHttpRequestを使用して、リークがまだ発生していることがわかりました。 – bwmfsu

1

問題は、私が信じる応答のjson構文解析と関係があります。私も同様の問題に遭遇し、それを隔離しました。

データタイプを 'text'に変更すると、リークはもう発生しません。私はこれがjson構文解析のためにeval()を使ってjQueryと関係していると思います。

とにかく、jsonを再帰的に解析するライブラリjson_parse.jsが見つかりました。これはIE9上で私のために働いた。私が取り組んでいるウェブサイトはIEのみのため、他のブラウザではテストしませんでした。

関連する問題