Как уничтожить объект JavaScript?



недавно я наткнулся на одно из моих приложений, которые потребляют слишком много памяти и увеличивается на 10 МБ/сек.



Итак, мне нравится знать лучший способ уничтожить объект JavaScript и переменные, чтобы потребление памяти оставалось вниз, и мой FF не может быть уничтожен.



Я вызываю два моих JavaScript в каждом интервале 8 сек без перезагрузки страницы.



function refresh() {
$('#table_info').remove();
$('#table').hide();
if (refreshTimer) {
clearTimeout(refreshTimer);
refreshTimer = null ;
}
document.getElementById('refresh_topology').disabled=true;
$('<div id="preload_xml"></div>').html('<img src="pic/dataload.gif" alt="loading data" /><h3>Loading Data...</h3>').prependTo($("#td_123"));
$("#topo").hide();
$('#root').remove();
show_topology();
}


Как я могу увидеть, какая переменная вызывает памяти и способ остановить выполнение этого процесса?

718   5  

5 ответов:

вы можете поместить весь свой код в одно пространство имен следующим образом:

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;

С помощью delete ключевое слово удалит ссылку на свойство, но на низком уровне сборщик мусора JavaScript (GC) получит дополнительную информацию о том, какие объекты должны быть исправлены.

вы также можете использовать инструменты разработчика Chrome, чтобы получить профиль памяти вашего приложения, и какие объекты в вашем приложении должны быть уменьшены.

вы не можете удалять объекты, они удаляются, когда нет больше ссылок на них. Вы можете удалить ссылки с помощью delete.

однако, если вы создали циклические ссылки в ваших объектах вам, возможно, придется де-пара некоторые вещи.

хотя существующие ответы дали решения для решения проблемы и второй половины вопроса, они не дают ответа на аспект самопознания первой половины вопроса, который выделен жирным шрифтом: "как я могу увидеть, какая переменная вызывает памяти...?"

возможно, это было не так надежно 3 года назад, но инструменты Chrome Devevloper"профили" раздел теперь довольно мощный и многофункциональный. Команда Chrome имеет проницательные статьи при использовании его и, таким образом, также как сбор мусора (GC) работает в JavaScript, который лежит в основе этого вопроса.

С delete Это в основном корень принятого в настоящее время ответа от Yochai Akoka, важно помнить, что делает delete. Это не имеет значения, если не сочетается с концепциями того, как GC работает в следующих двух ответах: если есть существующая ссылка на объект, он не очищается. Этот ответы более правильные, но, вероятно, не так ценятся, потому что они требуют больше мысли, чем просто писать "удалить". Да, одним из возможных решений может быть использование delete, но это не будет иметь значения, если есть еще одна ссылка на утечку памяти.

delicateLatticeworkFever надлежащим образом упоминает циклические ссылки, и документация команды Chrome может обеспечить гораздо большую ясность, а также инструменты для проверки причины.

С delete упоминалось здесь, это также может быть полезно предоставить ресурс Понимание Удалить. Хотя он не попадает ни в одно из фактических решений, которое действительно связано с GC js.

структурируйте свой код так, чтобы все ваши временные объекты находились внутри замыканий вместо глобального пространства имен / свойств глобального объекта и выходили из области действия, когда вы закончите с ними. Об остальном позаботится ГК.

я столкнулся с такой проблемой, и у меня была идея просто изменить innerHTML детей проблемного объекта.

adiv.innerHTML = "<div...> the original html that js uses </div>";

кажется грязным, но это спасло мою жизнь, как это работает!

Comments

    Ничего не найдено.