использование памяти и утечки при повторных вызовах ajax - PullRequest
0 голосов
/ 31 октября 2010

У меня следующий Ajax-вызов, который отправляет данные формы на страницу и находит конкретный ответ.

$.ajax({
    url: $("form[name='MainForm']").attr('action'),
    data: $("form[name='MainForm']").serialize()+'&btnupdateprice.x=0&btnupdateprice.y=0',
    type: 'POST', 
    cache: false,
    success: function(response) {
        errors = $(response).find("#listOfErrorsSpan");
        result2= $(response).find(".colors_pricebox:eq(0)");
        $(".colors_pricebox:eq(0)").replaceWith(
            '<table width="100%" cellspacing="0"  cellpadding="0" border="0" class="colors_pricebox">' + result2.html() + '</table>');
        $('#listOfErrorsSpan').replaceWith(
            '<span id="listOfErrorsSpan">' + errors.html() + '</span>');
    }
});

Каждый раз, когда страница вызывает эту страницу через Ajax, она загружает около 74 тыс. Данных. У меня нет конкретного вопроса программирования, но вместо этого я хотел бы знать, есть ли способ или способы ограничить возможность любых утечек или ... в этом случае я извлекаю две области загруженной страницы и сохраняю ее переменная «ошибка» и переменная «результат2».

Нужно ли что-то делать, например уничтожить, отсоединить или иным образом «удалить» неиспользуемые данные в ответе. Это где-то хранится. Каждая перезагрузка через Ajax перезаписывается или занимает новое место. Делать или мне нужно уничтожить ошибку и привести 2 переменные после их использования, так как они больше не нужны? Или, возможно, я бы использовал или не использовал переменные для хранения результата и просто делал это напрямую, как показано ниже?

Извините, если у меня нет особого смысла. Не очень знаком с этим. Я просто хотел бы знать, если есть что-то, что я должен быть обеспокоен в отношении утечек. Спасибо за любой отзыв.

$(".colors_pricebox:eq(0)").replaceWith(
    '<table width="100%" cellspacing="0" cellpadding="0" border="0" class="colors_pricebox">' + $(response).find(".colors_pricebox:eq(0)") + '</table>');

$('#listOfErrorsSpan').replaceWith(
    '<span id="listOfErrorsSpan">' + $(response).find("#listOfErrorsSpan").html() + '</span>');

1 Ответ

2 голосов
/ 31 октября 2010

Что именно является симптомом (ами) и в каком браузере (ах)?

JavaScript - это язык GC, а недоступные объекты удаляются (восстанавливаются) соответствующим образом (это немного «ловит»"как контексты исполнения связаны, но ...).Если нет конкретной проблемы, не беспокойтесь об этом :-) - я могу вспомнить некоторые надуманные примеры, включающие контекст выполнения с временными данными, которые хранятся слишком долго, но на практике я не сталкивался с таким случаем, чтона самом деле имеет значение. Jibbering Notes: JavaScript Closures говорит о контекстах выполнения и областях, которые должны охватывать эту потенциальную форму «утечки».

Если вы do столкнетесь с таким случаем, выможет освобождать ссылки (например, x = null) или использовать ключевое слово delete.Они фактически не «удаляют» объект (ключевое слово delete может удалить свойства), но могут (если ссылок больше нет) сделать его пригодным для восстановления.

В приведенном выше коде он выглядитподобно тому, как используются «глобальные» переменные (error и result2), если это так (и они не нужны), использование локальных переменных может сделать больше объектов пригодными для восстановления, так как локальные переменные исчезнут с контекстом выполнения (таким образом потенциально создавая объектыони содержат право на рекультивацию).Однако в следующий раз при выполнении обратного вызова значения будут перезаписаны, что (если не будет сохранена другая ссылка) сделает предыдущие объекты пригодными для восстановления - то есть проблем с наложением нет.Сравните это с:

globalArrayThatIsNeverCleared.push(result2)

Есть (или были?) Также некоторые утечки памяти IE, вызванные доступом к объектам "вне" JavaScript GC, что привело к циклическим графам, которые не могли быть освобождены, и т. Д.

...