Решение проблем утечки памяти в Javascript / jQuery в $ .post - PullRequest
1 голос
/ 12 декабря 2011

У меня проблема с утечкой памяти, которую я пытаюсь отследить в веб-приложении, используя jQuery-1.7.1.Приложение отправляет POST-запрос на сервер для получения некоторых результатов поиска, используя сложную форму.После того, как я удалил большую часть кода js (для целей отслеживания утечек), голая функция выглядит следующим образом:

$(function() {
  // bind the search action
  $('#search-button').unbind('click').click(function() { doSearch(); });
});

function doSearch() {
  // get the query string from the search form
  var query = $('#search-form').serialize();

  // perform search and render results
  $.post('/search', query, function(data){
    // nothing here now (trying to debug)
    data = null;
  }, 'json');

  query = null;
}

Я вижу, что потребление памяти накапливает дополнительные ~ 1 МБ каждый раз, когда я нажимаю кнопку поискахотя, по сути, это ничего не делает.Это реальная проблема, так как приложение имеет режим поиска «автообновление», при котором этот вызов выполняется примерно раз в минуту, поэтому если оставить его активным, оно через некоторое время заклинит браузер.

Объект data, возвращаемый с сервера, содержит логическое значение для успеха / неудачи и html-строку для рендеринга (довольно большая в случае успеха, около 1 МБ или около того):

data = {
  success : true/false,
  html    : "<div id='results'>.....</div>"
}

Так как я собираюсь выполнить zilch в реальном теле обратного вызова, я подозреваю, что каким-то образом этот data не удаляется из области видимости и агрегируется в памяти.Я попытался установить его в null в конце обратного вызова, но это не сработало.Это было проверено на chrome и firefox (более ранние и последние выпуски для обоих).Я что-то пропустил?Любые мысли помогут - спасибо.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2011

На самом деле нет надежного способа заставить javascript выполнять сборку мусора.

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

query = null;
delete query;
0 голосов
/ 12 декабря 2011

В формате JSON должны быть кавычки для каждого ключа

Попробуйте

data = {
  "success" : true/false,
  "html"    : "<div id='results'>.....</div>"
}

Я говорю о выводе строки на стороне сервера

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