Показать сообщение отдельно
  #4 (permalink)  
Старый 14.04.2010, 18:26
Интересующийся
Отправить личное сообщение для switch001 Посмотреть профиль Найти все сообщения от switch001
 
Регистрация: 14.04.2010
Сообщений: 29

Добрый день всем
Столкнулся с утечкой памяти вот в такой конструкции:
<BODY onload='init_timers()' >
    <script type="text/javascript"> 
    function init_timers()
    {
        query_timer = setInterval("ExtenQuery()",5000);
        ExtenQuery();  
    }
        function ExtenQuery()
        {
            $.getJSON("extensions-realtime.php?show=query",
//запрос возвращает данные в таком виде:
//     {
//        "200_Status":"<div class='stat-1'>&nbsp;</div>",
//        "113_Status":"<div class='stat8'>&nbsp;</div>",
//        "200_Connected":"113",
//        "200_Duration":"00:03",
//        "200_Application":"Dial",
//        "200_CallerID":"&nbsp;",
//        "200_Channel":"Local/200@from-internal-custom-3e97,2",
//        "113_Connected":"200",
//        "113_Duration":"00:03",
//        "113_Application":"Dial",
//        "113_CallerID":"menu-3&nbsp;",
//        "113_Channel":"LOCAL/113@ext-local|60|S(1361)M(mname})",
//     }
//размер ответа в среднем 2..4 кб.
     
                function(obj)
                { 
                    
                    j=j+1;//добавляем номер (с каждой итерацией увеличивается id, 
                            //чтоб знать, где удалить старое и вписать новое 
                    jQuery.each(obj, function(i, val) 
                    //отражаем изменения на странице в соответствии с результатом запроса
                    {
                        $("#" + i+" div").replaceWith("<div class=\"value"+j+"\">" + val+ "</div>");
                    });
                    //удаляем старое
                    $(".value" + (j-1) ).replaceWith("<div class=\"value"+j+"\">&nbsp;</div>");

                });
        }
</script>

....тут обрабатываемые объекты.....         
 <div class="reg1" id="exten_101"> 
    <div class="stat0" id="101_Status"><div class="value">&nbsp;</div></div> 
    <div class=usernum>101:</div> 
    <div class=username>Meleshko Ekaterina&nbsp;</div> 
    <div class=stats id="101_Connected"><div class="value">&nbsp;</div></div> 
    <div class=stats>:</div> 
    <div class=stats id="101_CallerID"><div class="value">&nbsp;</div></div> 
    <div class=time id="101_Duration"><div class="value">&nbsp;</div></div> 
</div> 
.... таких объектов много....
<div class="reg1" id="exten_200"> 
    <div class="stat0" id="102_Status"><div class="value">&nbsp;</div></div> 
    <div class=usernum>200:</div> 
    <div class=username>Loginova Valeiya&nbsp;</div> 
    <div class=stats id="200_Connected"><div class="value">&nbsp;</div></div> 
    <div class=stats>:</div> 
    <div class=stats id="200_CallerID"><div class="value">&nbsp;</div></div> 
    <div class=time id="200_Duration"><div class="value">&nbsp;</div></div> 
</div>

все остальные части убрал, так как проверил их по отдельности, они не ведут к утечкам.
подозрения: jquery не очищает старый экземпляр obj; DOM каким-нибудь образом заполняется неудаленными элементами, браузер кеширует запросы (в php добавляю заголовки, чтоб не кэшировал).
Просто приложение должно работать круглосуточно, а за четыре часа работы размер окна браузера превышает 120 Мб (тестирую в хроме и лисе), что никуда не годится.
Вопрос, собственно, такой: куда посмотреть, что копнуть, чтобы обнаружить и убрать утечку памяти. Или я использую jquery неправильно, что приводит к утечкам? От jquery отказываться не хочется, т.к. удобна она уж очень...

Последний раз редактировалось switch001, 14.04.2010 в 18:29.
Ответить с цитированием