Утечка памяти в jQuery при повторных вызовах .ajax - PullRequest
7 голосов
/ 01 сентября 2010

Я использую следующий шаблон, который пропускает память в Firefox:

$(function() {

    (function() {

        var callee = arguments.callee;

        $.ajax({
            url: '...',
            success: function() { ... setTimeout(callee, 1000); },
            error: function() { ... setTimeout(callee, 1000); }
        });

    })();

});

Утечка памяти сохраняется, даже если успех / ошибка не делают ничего, кроме повторного вызова setTimeout. Я наблюдаю утечку через диспетчер задач Windows; если страница остается открытой, использование памяти firefox.exe медленно возрастает. Для окончательной версии этого кода мне нужно обновлять только раз в минуту, но раз в секунду, утечка памяти намного быстрее!

(Примечание: это похоже на проблему, очень похожую на на этот вопрос , но выбранный ответ там, похоже, не отвечает Firefox)

Ответы [ 3 ]

4 голосов
/ 14 октября 2010

Я смог воспроизвести проблему и решил ее так:

$(function() 
{
    function checkStatus() 
    {
        $.ajax({
          url: '...',
          success: function() { ... setTimeout(checkStatus, 1000); },
          error: function() { ... setTimeout(checkStatus, 1000); }
        });

    }

    checkStatus();

});

Кажется, что каждый раз, когда вызывается ваш анонимный метод, он создает переменную и присваивает ей ссылку. Если у вас будет достаточно времени, это заполнит память.

Это решение просто передает одну и ту же функцию ref вместо создания новой с каждой итерацией.

0 голосов
/ 22 сентября 2010

Попробуйте поместить вызываемый объект вне функций следующим образом:

var callee = arguments.callee;

$(function() {

    (function() {

        $.ajax({
            url: '...',
            success: function() { ... setTimeout(callee, 1000); },
            error: function() { ... setTimeout(callee, 1000); }
        });

    })();

});

Чтобы память выделялась только один раз для вызываемого, а не каждый раз, когда выполняются функции.

0 голосов
/ 15 сентября 2010

может быть стоит попробовать что-то подобное?

$(function() 
{
    (function() 
    {
        var callee = arguments.callee;
        $.ajax(
        {
            url: '...',
            success: function() 
            {
                ... 
                setTimeout(function()
                {
                    callee();
                }, 1000);
             },
             error: function() 
             {
                ... 
                setTimeout(function()
                {
                    callee();
                }, 1000);
              }
        });   
    })();
});

чтобы передать calle в функцию обратного вызова setTimeout, передать анонимную функцию, которая вызывает calle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...