2011-11-17 20 views
1

編輯2 -爲什麼在ie 8中泄漏內存?

爲了重建 - (我希望)

創建一個空的asp.net項目,添加Default.aspx的,和about.aspx

使用默認此代碼。 aspx文件:

http://pastebin.com/4Ri1BufM

這對於about.aspx

http://pastebin.com/Ni9dZL7c

建立,並對其運行篩。點擊按鈕,然後點擊鏈接。篩現在應該列出1個內存泄漏。

這個簡單的佈局將一個服務器按鈕放在一個面板內。如果你點擊它,然後將「離開」鏈接,篩報告1個內存泄漏:

http://localhost:2605/Default.aspx (1 reference) 
<INPUT value="partial postback" type=submit name=ctl01 > 

.aspx的源:

<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
    Inherits="LeakTestProject._Default" %> 
<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <form id="Form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:Button Text="partial postback" runat="server" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
    </form> 
    <a href="SomeOtherPage.aspx" >leave</a> 
</body> 
</html> 

我一直認爲我在追查內存泄漏我的應用於此源。

任何人都可以解釋爲什麼會發生這種情況,以及如何解決它?

(注 - 沒有服務器端代碼運行)

編輯 -

這裏是生成的html:

<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <form method="post" action="Default.aspx" id="Form1"> 
<div class="aspNetHidden"> 
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> 
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTUzNzM3OTMxMmRk27mKixZYS2MtHiuw7SZF6+1A/CkWRnnarcN2a05yCJs=" /> 
</div> 

<script type="text/javascript"> 
//<![CDATA[ 
var theForm = document.forms['Form1']; 
if (!theForm) { 
    theForm = document.Form1; 
} 
function __doPostBack(eventTarget, eventArgument) { 
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
     theForm.__EVENTTARGET.value = eventTarget; 
     theForm.__EVENTARGUMENT.value = eventArgument; 
     theForm.submit(); 
    } 
} 
//]]> 
</script> 


<script src="/WebResource.axd?d=_lxNoU5aYdEC_WWnUhGTN0VgFQnwFJ1fkZBkPhUGNITY1Tt87f4CGSPd9dhq2TD9I8lv5ljTGi956KpbHSLq3ebld0t7nKLON7Hc04CCAwA1&amp;t=634525784292792916" type="text/javascript"></script> 


<script src="/ScriptResource.axd?d=0VE3fsyoY2cTFnat6m0YjE4OCCjVV0jmjSC6wigMBEOHyKW8kewBrhtJnBFIn73VSWcGW45QXwelC5m-1iZoornC8qWpZ-kXP-Y38e49qW1TbssOgo419ZWtVHSVmIpSg9CvXOQzUBClAjuHORyX5Q2&amp;t=ffffffffbd2983fc" type="text/javascript"></script> 
<script type="text/javascript"> 
//<![CDATA[ 
if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax client-side framework failed to load.'); 
//]]> 
</script> 

<script src="/ScriptResource.axd?d=DBlWOXkmp0ycsSicGEZhACmLuhW1VF8BppK-Uj8ijyjhFxx7MTG8NW0gLl3IJ6TyEo2rAMfLCQ9rO_bk2wDCcpyT3Df6CN-TLMAA575gUNAjTSzC6U1koagV2FYRmu4TNsAgoEjhkN6fJX3lENf7Bw2&amp;t=ffffffffbd2983fc" type="text/javascript"></script> 
<div class="aspNetHidden"> 

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgLZvOXNBgKiwImNCx8fSMXEwq+V+5yrnoaTcidPwoJw3ebm6DJQ1D3fVVAL" /> 
</div> 
    <script type="text/javascript"> 
//<![CDATA[ 
Sys.WebForms.PageRequestManager._initialize('ScriptManager1', 'Form1', ['tUpdatePanel1','UpdatePanel1'], [], [], 90, ''); 
//]]> 
</script> 

    <div id="UpdatePanel1"> 

      <input type="submit" name="ctl01" value="partial postback" /> 

</div> 
    </form> 
    <a href="About.aspx" >leave</a> 
</body> 
</html> 
+0

因此,這是隻有在IE8?打開兼容模式怎麼樣?你有沒有嘗試禁用瀏覽器上的插件,看看有沒有做什麼?如何啓動IE開發工具欄的東西,看看你是否可以看到是否有任何JavaScript輪詢或任何事情。也許使用Firebug來達到同樣的目的。從外觀上看,它看起來「很好」。 –

+0

@rangitatanz sieve只適用於ie,但回到有問題的原始應用程序,它在chrome和ff中運行良好。我用profiling工具偷看了正在運行的腳本,但它在3個axd資源文件中運行了幾百個函數,共計約10k行javascript。 – asawyer

+0

你運行的是什麼版本的.net? –

回答

0

根據http://www.codeproject.com/KB/ajax/jqmemleak.aspx存在內存泄漏聽起來就像你正在經歷的那樣。

見「迭代2 - 內存泄漏」

利用一種稱爲「篩」他說工具「你可以看到,每次我點擊刷新時間,它會創建一個新的組輸入要素不破壞以前的。 '

他的修復程序是一個調用Update面板清理鉤子的JQuery插件。你可以試試這個嗎?

(function($) { 
    $.fn.Disposable = function(cln) { 
     return this.each(function() { 
      var el = this; 
      if (!el.dispose) { 
       el.dispose = cleanup; // will be called by 
          // Microsoft for cleanup 
      $(window).bind("unload", cleanup); 
    } 

    function cleanup() { 
      if (!el) 
       return; 
      $(el).unbind(); 
      $(window).unbind("unload", cleanup); 
      el.dispose = null; 
      el = null; 
     }; 
    }); 
    }; 
})(jQuery); 

function add() { 
    $get('res').value = 
     parseInt($get('i1').value) + parseInt($get('i2').value); 
} 
Sys.Application.add_load(function() { 
    $('.num').change(add).Disposable(); 
}); 
+0

我已閱讀過此頁面。這是一個腳本,允許您在發生更新面板刷新時自動清理jQuery關閉。在這個例子中,沒有加載jQuery。根本沒有用戶的JavaScript。 – asawyer

+0

您是否嘗試過使用sIEve工具?我的理解是,無論JQuery是否在頁面上,updatepanel都是這樣做的。修正只是用JQuery編寫的? –

+0

它在第一句中提到... – asawyer

0

請你試試這個變化:

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 

<script> 
    Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(my_init); 
    function my_init() { 
     document.getElementById("UpdatePanel1").innerHTML = ""; 
    } 
</script> 
+0

我肯定會,但它將不得不等到下週二! – asawyer

+0

這沒有做任何改變,它仍在報告內存泄漏。 – asawyer