eval()
(проект достаточно старый, так что там реализовано именно так, плюс все переменные объявляются только через var
).При каждом обновлении страницы по AJAX в память добавляется новая строка (та, которая выполняется через eval()
). Таким образом, каждое обновление страницы отъедает около 800 КБ оперативной памяти, т.е. возникает утечка памяти.
Почему так происходит, установить пока не удаётся. Возможно, что при выполнении JS-кода через eval()
, строка остаётся в оперативной памяти. Как видно на скриншоте, Distance у таких строк равен нулю, значит, такие строки находятся на корневом уровне и какие-либо объекты на них не ссылаются.
Возможно ли каким-то образом выявить, почему эти строки остаются в оперативной памяти, раз на них никто не ссылаются? И можно ли их удалить из оперативной памяти без обновления страницы стандартным способом? Я буду признателен совершенно любой информации, которая поможет в решении этого вопроса.
Помогло решение с очисткой строк. Вот статья на Хабре: "Нужно ли чистить строки в JavaScript?".
Конкретно в моём случае подошёл следующий вариант:
//Очищаем строку после substr(), чтобы она не хранила ссылку на родителя
str = str.split('').join('');
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть структура, которая хранит событие и флаг является оно последним или нет