Простой JQuery AJAX утечки в FF4 (Windows7) - PullRequest
1 голос
/ 07 апреля 2011

В моем веб-приложении произошла утечка памяти, поэтому я создал тестовую веб-страницу, чтобы посмотреть, смогу ли я выяснить, что на самом деле было утечкой. Итак, я пришел к этому простому куску кода, который может очень быстро увеличить потребление памяти до 300 МБ.

В Chrome, похоже, не просачивается тот же код, так как использование памяти значительно уменьшается после запуска GC. В FF4 (Windows 7) использование памяти никогда не уменьшается, даже после завершения работы кода.

Что является причиной утечки памяти здесь или это проблема FF4 (у меня заметил несколько )?

Примечание: Я использую jQuery 1.5 и работаю в безопасном режиме со всеми отключенными надстройками.

    $.ajaxSetup ({
        cache: false
    });

    var counter = 0;
    ajaxTest();

    function ajaxTest()
    {
        $.ajax({
            type: "GET",
            url: "/web/data/data.xml",
            dataType: "xml",
            success: function(xml) {
                $("#counter").text(++counter);
                xml = null;

                if (counter < 2000)
                    setTimeout(ajaxTest,25);
            }});
    }

Ответы [ 3 ]

1 голос
/ 06 мая 2011

Это [анти-] шаблон:

 function bar()
    {
       function foo() { setTimeout(bar,25); }
       setTimeout(foo,1);
    }

известен как "Русская рулетка". На каждой итерации вы создаете новое рекурсивное замыкание. Технически это не утечка, а просто рекурсивная структура памяти.

0 голосов
/ 06 мая 2011

Возможно, это связано с тем, что для кеша установлено значение false. Это не мешает вашему браузеру кэшировать ответы; он просто отправляет каждый запрос уникально, поэтому не пытается использовать кэшированный ответ. Возможно, Chrome лучше справляется с бесполезными кэшированными файлами ... Я не знаю, как работает кэширование в браузере, но две тысячи копий одного и того же XML-файла, вероятно, занимают много памяти.

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

РЕДАКТИРОВАТЬ: На самом деле это было, вероятно, неправильно. Вы должны проверить http://blog.linkibol.com/2010/05/07/did-you-know-that-jquery-leaks-memory-like-a-fountain/

Я не совсем уверен, почему Chrome освобождается от этой проблемы ...

0 голосов
/ 07 апреля 2011

Вы можете просто вызвать ajaxTest без setTimeout в конце функции обратного вызова.зачем вообще нужен setTimeout?

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