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

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

5 ответов


вы можете поместить весь свой код в одно пространство имен, например:

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;

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

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


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

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


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

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

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

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

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


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


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

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

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