Подтвердить что ты не робот

Как уничтожить объект 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();
}

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

4b9b3361

Ответ 1

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

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;

используя ключевое слово delete, удалит ссылку на свойство, но на низком уровне в javascript GC появится больше информации о том, какие объекты будут исправлены.

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Поскольку здесь упоминалось удаление, также может быть полезно предоставить ресурс Understanding Delete. но он НЕ попадает в какое-либо фактическое решение, которое действительно связано с js GC.

Ответ 4

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

Ответ 5

У меня возникла такая проблема, и у меня возникла идея просто изменить innerHTML проблемных дочерних объектов.

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

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