Почему эта утечка памяти в то есть 8? - PullRequest
1 голос
/ 17 ноября 2011

редактировать 2 -

Воссоздать - (надеюсь)

Создайте пустой проект asp.net, добавьте default.aspx и about.aspx

используйте этот код для файла default.aspx:

http://pastebin.com/4Ri1BufM

и это для about.aspx

http://pastebin.com/Ni9dZL7c

Стройте и запускайте сито против него. Нажмите кнопку, затем ссылку. Сито должно теперь перечислить 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>

Мне кажется, я обнаружил утечку памяти в моем приложении к этому источнику.

Кто-нибудь сможет объяснить, почему это происходит, и что делать, чтобы это исправить?

(Примечание - серверный код не работает)

Edit-

Вот сгенерированный 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>

Ответы [ 2 ]

0 голосов
/ 23 декабря 2011

не могли бы вы попробовать это изменение:

<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 голосов
/ 21 ноября 2011

Согласно 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();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...