【问题标题】:Why is this leaking memory in ie 8?为什么在 ie 8 中会出现内存泄漏?
【发布时间】:2011-11-17 14:51:40
【问题描述】:

编辑 2 -

重新创造——(我希望)

创建一个空的 asp.net 项目,添加一个 default.aspx 和一个 about.aspx

将此代码用于 default.aspx 文件:

http://pastebin.com/4Ri1BufM

这对于 about.aspx

http://pastebin.com/Ni9dZL7c

构建并对其运行筛子。点击按钮,然后点击链接。 Sieve 现在应该列出 1 个内存泄漏。

这种简单的布局在面板中放置了一个服务器按钮。如果单击它,然后单击“离开”链接,sIEve 会报告 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>

【问题讨论】:

  • 所以这只是在 IE8 中?开启兼容模式会怎样?您是否尝试过禁用浏览器上的插件以查看是否有任何作用?启动 IE 开发人员工具栏以查看是否可以查看是否有任何 javascript 轮询正在进行或任何事情怎么样。也许出于同样的目的使用 Firebug。从外观上看,它看起来“不错”。
  • @rangitatanz sieve 仅适用于 ie,但回到有问题的原始应用程序,它在 chrome 和 ff 中运行良好。我用分析工具查看了正在运行的脚本,但它在 3 个 axd 资源文件中运行了几百个函数,总共大约 10k 行 javascript。
  • 你运行的是什么版本的 .net?
  • @rangitatanz 与 2010 sp1、.Net 4、ajaxtoolkit 版本 3.0.30930.28736
  • 您是否确认这适用于在另一台笔记本电脑上进行 IE8 的 diff 全新安装?

标签: asp.net memory-leaks updatepanel


【解决方案1】:

根据http://www.codeproject.com/KB/ajax/jqmemleak.aspx 的说法,有一个内存泄漏,听起来很像您正在经历的。

请参阅“迭代 2 - 内存泄漏”

使用名为“SIEve”的工具,他说“您可以看到,每次我单击刷新时,它都会创建一组新的输入元素,而不会破坏以前的元素。 '

他的修复是一个调用更新面板清理钩子的 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();
});

【讨论】:

  • 我之前已经查看过该页面。它是一个脚本,允许您在更新面板刷新发生时自动清理 jQuery 闭包。在示例中,没有加载 jQuery。根本没有用户 javascript。
  • 您是否尝试过使用 sIEve 工具?我的理解是,无论 JQuery 是否在页面上,updatepanel 都会这样做。修复只是用 JQuery 编写的?
  • 好吧,没有加载任何jQuery,所以插件不会运行,我在发布问题之前首先使用了筛子找到了问题。
  • 好吧,没有读过你说你使用 sIEve 的第一行。我现在刚刚尝试过 - 使用您的代码示例和 sIEve,它每次都坐在完全相同的内存上。当我转到作为空白页面的“somepage.aspx”时 - 它会按照我的预期回落。我无法复制你的问题,所以除非你能给我一些东西 - 例如我可以现场测试的网络表单.. 或 skydrive 中的项目?
  • 在 Windows 7 32 位上试过,在 cassini 和 IIS 上运行
【解决方案2】:

你能试试这个改变吗:

<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>

【讨论】:

  • 我肯定会,不过得等到下周二!
  • 这个没有做任何改变,它仍然在报告内存泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2011-10-25
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多