Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.12.2011, 00:55
Интересующийся
Отправить личное сообщение для Greck Посмотреть профиль Найти все сообщения от Greck
 
Регистрация: 27.07.2011
Сообщений: 27

Освобождение памяти или как удалить this?
В общем, javascript-приложение, работа с большими объемами данными, продолжительное время без перезагрузки страницы. Памяти кушает неплохо и со временем работы начинает расходовать все больше. Почитал про освобождение памяти сборщиком мусора, вроде бы почистил все лишние ссылки, но функционал большой, может быть что-то и упустил.

Есть еще подозрения на события. Я так и не понял, удаляются ли они при удалении элемента из DOM. Для назначения событий использую jQuery, live только в нескольких местах и этот обработчик я удаляю вручную.

Усложняет тестирование еще тот факт, что я не знаю как проверить какой объект удалился автоматически, а какой нет. console.dir() - не разу не показал пустой объект, я так понял, что если на объект ссылается консоль, то он, тоже, не удаляется.

В идеале, конечно, вручную удалить this, но я так понял, что это не тривиальная задача.

Подскажите как быть?
Ответить с цитированием
  #2 (permalink)  
Старый 14.12.2011, 01:27
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от Greck
Есть еще подозрения на события. Я так и не понял, удаляются ли они при удалении элемента из DOM. Для назначения событий использую jQuery, live только в нескольких местах и этот обработчик я удаляю вручную.
Если ссылок на элемент не остаётся - то удаляются.

Сообщение от Greck
Усложняет тестирование еще тот факт, что я не знаю как проверить какой объект удалился автоматически, а какой нет. console.dir() - не разу не показал пустой объект, я так понял, что если на объект ссылается консоль, то он, тоже, не удаляется.
Объект живёт, пока на него остаётся хоть одна ссылка.

Сообщение от Greck
В идеале, конечно, вручную удалить this, но я так понял, что это не тривиальная задача.
А я вообще не понял, что это. Удалить this - это как?

Сообщение от Greck
Подскажите как быть?
Читать про замыкания и думать, не остаётся ли что-нибудь в них.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #3 (permalink)  
Старый 14.12.2011, 02:35
Интересующийся
Отправить личное сообщение для Greck Посмотреть профиль Найти все сообщения от Greck
 
Регистрация: 27.07.2011
Сообщений: 27

Цитата:
Если ссылок на элемент не остаётся - то удаляются.
Знаю, что есть такая проблема, писал с учетом этого. Значит с событиями должно быть все нормально.

Цитата:
Объект живёт, пока на него остаётся хоть одна ссылка.
Я как бы догадывался А как определить, что на объект нет не одной ссылки и он удалился. console.dir() это должен показать, в каком браузере он точно работает так?

Цитата:
А я вообще не понял, что это. Удалить this - это как?
Наверное, что-то типа:
var object = {
    ...
    close: function(){
        ...
        delete this;
    }
});


Цитата:
Читать про замыкания и думать, не остаётся ли что-нибудь в них.
Да, объекты создаются конструктором. Но большинство ссылок именно из событий, которые создаются самим объектом и связаны с DOM-элементами, которые затем удаляются.
Ответить с цитированием
  #4 (permalink)  
Старый 14.12.2011, 02:42
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

console.dir() - ссылка на объект. Пока есть вероятность, что объект может быть использован какой-то ф-цией или ещё чем-либо - объект живёт.

Удалить this нельзя. Не путайте js с c++.

P. S. Не путайте - не в смысле, что в с++ можно удалить this (там и слова-то такого нет), просто delete вообще по-другому действует в js.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #5 (permalink)  
Старый 14.12.2011, 02:54
Интересующийся
Отправить личное сообщение для Greck Посмотреть профиль Найти все сообщения от Greck
 
Регистрация: 27.07.2011
Сообщений: 27

Цитата:
console.dir() - ссылка на объект. Пока есть вероятность, что объект может быть использован какой-то ф-цией или ещё чем-либо - объект живёт.
То есть, нет никакой возможности определить удалился ли ненужный объект из памяти или нет?
Ответить с цитированием
  #6 (permalink)  
Старый 14.12.2011, 02:54
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Цитата:
10.2.1 Глобальный код

Создаётся иерархия областей видимости, которая после инициализации содержит только один глобальный объект и никаких более.
Инстанциация переменных производится при помощи глобального объекта в качестве объекта переменных, с использованием атрибутов свойств { DontDelete }.
Значением this является глобальный объект .
http://javascript.ru/ecma/part10#a-10.1.7
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #7 (permalink)  
Старый 14.12.2011, 02:58
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Greck,
Нет, ну когда вы его явно удалили то есть конечно:
window.object = {};
delete window.object;
alert(window.object);
А вот проверить удалён ли он сборщиком мусора.. В Chrome вроде как есть профайлер памяти и замыканий, если не ошибаюсь. Но это не означает, что во всех браузерах сборщик сработает точно так же. Хотя вероятность этого высока.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #8 (permalink)  
Старый 14.12.2011, 03:25
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

garbage collector ( тоесть сборщик мусора ) срабатывает по разным правилам, как правило данный метод реализовывают разработчики браузеров. Он не срабатывает сразу же после удаления объекта, а срабатывает в промежутках определенного времени. Тоесть с неким интервалом. Например в ИЕ если удалить объект посредством delete obj; сборщик может не освободить память, понятия не имею как он у них работает, но для ИЕ часто нужно делать явную потерю ссылки тоесть:
var obj = {}
window.obj = null;
Назначая переменной значение null, в реестре замыканий происходит отчисление числа количества принятых ссылок. Когда число ссылок равно нулю, сборщик уничтожает объект.

К сожалению функция delete не гарантирует отчисление от счетчика замыканий, поэтому лучше использовать именно null;
Ответить с цитированием
  #9 (permalink)  
Старый 14.12.2011, 03:25
Интересующийся
Отправить личное сообщение для Greck Посмотреть профиль Найти все сообщения от Greck
 
Регистрация: 27.07.2011
Сообщений: 27

Цитата:
В Chrome вроде как есть профайлер памяти и замыканий, если не ошибаюсь.
Для отладки, это то, что нужно. Думаю, 99% утечек будут общие для всех браузеров.
Ответить с цитированием
  #10 (permalink)  
Старый 14.12.2011, 03:28
Интересующийся
Отправить личное сообщение для Greck Посмотреть профиль Найти все сообщения от Greck
 
Регистрация: 27.07.2011
Сообщений: 27

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалить переменную из памяти gradus Общие вопросы Javascript 7 11.02.2015 21:13
Как удалить из набора элементы у которых дисплей нан KamalovRadik jQuery 3 30.10.2011 16:11
как найти и удалить массив из массива? FRIE Общие вопросы Javascript 8 14.03.2011 15:48
Как удалить элемент из дерева DOM dummer jQuery 13 16.01.2011 16:19
Как удалить из памяти весь XML документ? EisBerg Events/DOM/Window 1 03.04.2010 14:45