У меня есть веб-страница с функцией «автообновление». При включении каждый второй страница извлекается через AJAX (так называемый page_request) и заменяет содержимое сНа контейнера с помощью прилагаемого containerid:Диагностика типа утечки Javascript
document.getElementById(containerid).innerHTML=page_request.responseText;
Это работает большая часть времени, никаких проблем.
Проблема возникает тогда, когда следующий скрипт в page_response:
<script type=\"text/javascript\">
$(document).ready(function() {
dtable = $('#multi-stat-table').dataTable();
});
</script>
Этот сценарий включает таблицу с идентификатором «мульти-стат стол» в сортировки таблицы с помощью DataTables JQuery плагин. Скрипт работает, и у меня есть сортируемые таблицы. Однако, если включено автоматическое обновление, происходит утечка памяти, которая в конечном итоге потребляет всю кучу (медленно, но верно).
Я вижу это явление, используя профилировщик памяти верхнего и хромированного типов. Каждая секунда, ~ 70 КБ данных выделяется, но освобождается только ~ 20 КБ. Следовательно, существует чистая потеря памяти в 50 Кбайт в секунду. Я просмотрел объекты в профилировщике, которые занимают память, но очень сложно понять из числа без описания, что на самом деле ссылаются на эти массивы и объекты. Я был не в состоянии понять, как сделать сборщик мусора собрать эти неиспользуемые объекты, которые накапливают каждый второй:
Я попытался установить dtable в нуль перед каждым автоматическим обновлением, но безрезультатно , Я также попытался вызвать dtable.api(). Clear() и dtable.api(). Destroy(), но утечка сохраняется. Как я могу найти эту утечку, и что еще более важно, что я могу сделать, чтобы остановить ее?
Вставлять фрагменты HTML с сервера, содержащего теги сценария в середине вашей страницы даже один раз, не говоря уже раз в минуту, кажется удивительно творческим способом вызвать всевозможные плохие вещи. – 2014-09-03 16:00:08
Я знаю, но это «Legacy Code» – RPGillespie