Непрерывное обновление страницы заставляет Firefox увеличивать потребление памяти в Windows

У меня странная ситуация с веб-приложением, которое продолжает использовать память в Firefox/Windows. По сути, приложение обновляет данные на странице с помощью вызова POST на сервер через jQuery. Каждый раз, когда выполняется вызов, потребление памяти Firefox увеличивается на величину, непропорциональную размеру данных, возвращаемых с сервера.

Чтобы проверить, относится ли это к моему приложению, я написал простое тестовое приложение, используя Sinatra (Ruby 1.9.2-p318) и jQuery (1.7.1). Приложение отправляет запрос на сервер каждые 10 секунд и загружает на страницу фрагмент HTML размером 1 МБ:

Сторона сервера:

require 'rubygems'
require 'sinatra'
require 'erb'
require 'json'

configure do
  set :static, true
end

post '/' do
  content_type :json

  # a simple html file containing ~ 1MB of data  
  html = File.read( File.join(File.dirname(__FILE__), 'html.txt' ) )

  # convert to JSON and return to the client
  return { "html" => html }.to_json
end

Сторона клиента:

<!doctype html>
<html>
  <head>
    <script type="text/javascript" src="/js/jquery-1.7.1.min.js"></script>
  </head>
  <body>
    <h1>Test Page</h1>
    <div id="results" style="display: none;"></div>

    <script type="text/javascript">
      $(function(){
        // refresh the data every 10 sec
        setInterval( function(){ doRefresh(); }, 10 * 1000 );
      });

      function doRefresh() {
        $.post('/', function(data){
          $('#results').html( data.html );
          // attempt to free some memory
          delete data;
        }, 'json');
      }
    </script>
  </body>
</html>

Что, похоже, не изменилось, так это то, что потребление памяти процессом Firefox (наблюдаемое через диспетчер задач Windows) продолжает увеличиваться на десятки мегабайт с каждым вызовом. Несмотря на то, что новые данные заменяют старые на странице, кажется, что Firefox не освобождает это выделенное пространство в памяти. Оказывается, это полностью расходует память, если страница остается открытой на ночь (на простых машинах с 4 ГБ).

Это проблема с javascript или что-то с Firefox? Могу ли я как-то принудительно собрать мусор? Благодарю.

EDIT: эта проблема с памятью не наблюдалась в Google Chrome (13.0.782.112 на Win7).


person sa125    schedule 27.03.2012    source источник
comment
Я думаю, вам, вероятно, следует сообщить об этом как об ошибке в Mozilla.   -  person vipw    schedule 27.03.2012
comment
Что касается проблемы с javascript или чем-то еще в Firefox?: попробуйте в другом браузере. Это должно сказать вам, связано ли это с семантикой языка или с браузером. Вероятнее всего второе, но проверить гипотезу всегда полезно.   -  person Supr    schedule 27.03.2012
comment
Проблема сохраняется, если вы выполняете только POST без фактического добавления содержимого в #results?   -  person Supr    schedule 27.03.2012


Ответы (1)


Если ваш аргумент «данные» был создан jQuery с ключевым словом «новое», вы должны написать этот код:

…
$('#results').html( data.html );
delete data;
…

При удалении переменная данных возвращает false. Я думаю, ты ничего не можешь сделать.

person Rodolphe BELOUIN    schedule 27.03.2012
comment
Пробовал, мало что сделал. Спасибо, в любом случае :) - person sa125; 27.03.2012
comment
это использование delete не имеет никакого эффекта. См. perfectionkills.com/understanding-delete. - person Nickolay; 28.03.2012