2011-04-07 2 views
1

Мое веб-приложение утечки памяти, поэтому я создал тестовую веб-страницу, чтобы узнать, могу ли я узнать, что действительно утечка. Таким образом, я пришел к этой простой части кода, которая может быстро вырасти до 300 мб памяти.Простой jQuery AJAX утечки в FF4 (Windows7)

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

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

Примечание: Я использую 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); 
      }}); 
    } 
+0

Мне еще нужно найти решение, но я также отметил эту проблему с Firefox 4.0.1 с помощью jQuery 1.5.1: jQuery Ajax Функции, похоже, протекают только в FF4, FF3.6 был в порядке – John

ответ

0

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

0

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

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

EDIT: На самом деле, возможно, это было неправильно. Вы должны проверить http://blog.linkibol.com/2010/05/07/did-you-know-that-jquery-leaks-memory-like-a-fountain/

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

1

Это [анти] схема:

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

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

+0

Интересно, что такое способ добиться того же результата без рекурсивного закрытия? – Chris

+0

@Chris: использовать 'setInterval' вместо использования рекурсивного вызова. –

+0

Если использовать setInterval, как обеспечить, чтобы вызов ajax был завершен на 100%? – Kuroro

Смежные вопросы