Освобождение памяти или как удалить this?
В общем, javascript-приложение, работа с большими объемами данными, продолжительное время без перезагрузки страницы. Памяти кушает неплохо и со временем работы начинает расходовать все больше. Почитал про освобождение памяти сборщиком мусора, вроде бы почистил все лишние ссылки, но функционал большой, может быть что-то и упустил.
Есть еще подозрения на события. Я так и не понял, удаляются ли они при удалении элемента из DOM. Для назначения событий использую jQuery, live только в нескольких местах и этот обработчик я удаляю вручную. Усложняет тестирование еще тот факт, что я не знаю как проверить какой объект удалился автоматически, а какой нет. console.dir() - не разу не показал пустой объект, я так понял, что если на объект ссылается консоль, то он, тоже, не удаляется. В идеале, конечно, вручную удалить this, но я так понял, что это не тривиальная задача. Подскажите как быть? |
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
var object = {
...
close: function(){
...
delete this;
}
});
Цитата:
|
console.dir() - ссылка на объект. Пока есть вероятность, что объект может быть использован какой-то ф-цией или ещё чем-либо - объект живёт.
Удалить this нельзя. Не путайте js с c++. P. S. Не путайте - не в смысле, что в с++ можно удалить this (там и слова-то такого нет), просто delete вообще по-другому действует в js. |
Цитата:
|
Цитата:
|
Greck,
Нет, ну когда вы его явно удалили то есть конечно:
window.object = {};
delete window.object;
alert(window.object);
А вот проверить удалён ли он сборщиком мусора.. В Chrome вроде как есть профайлер памяти и замыканий, если не ошибаюсь. Но это не означает, что во всех браузерах сборщик сработает точно так же. Хотя вероятность этого высока. |
garbage collector ( тоесть сборщик мусора ) срабатывает по разным правилам, как правило данный метод реализовывают разработчики браузеров. Он не срабатывает сразу же после удаления объекта, а срабатывает в промежутках определенного времени. Тоесть с неким интервалом. Например в ИЕ если удалить объект посредством delete obj; сборщик может не освободить память, понятия не имею как он у них работает, но для ИЕ часто нужно делать явную потерю ссылки тоесть:
var obj = {}
window.obj = null;
Назначая переменной значение null, в реестре замыканий происходит отчисление числа количества принятых ссылок. Когда число ссылок равно нулю, сборщик уничтожает объект.К сожалению функция delete не гарантирует отчисление от счетчика замыканий, поэтому лучше использовать именно null; |
Цитата:
|
Всем спасибо, вроде бы понял куда дальше копать, попробую отладить сначала все в Хроме, потом посмотрю что с другими браузерами выйдет.
|
Цитата:
|
А есть где то мануал как искать утечки в хроме/фф? :blink:
|
Внимание, тест сожрет много памяти...
alert( "перед запуском посмотри запомним занимаемое количество памяти браузером" );
var a = [];
for( var i = 0; i < 20000; i++ ) {
a[ i ] = [];
for( var j = 0; j < 1000; j++ ) {
a[ i ][ j ] = "blah";
}
}
alert( "теперь смотри сколько заняло" );
a = null;
alert( "а теперь должно освободиться место в памяти" );
alert( "пробуем другой пример" );
var b = [];
for( var i = 0; i < 20000; i++ ) {
b[ i ] = [];
for( var j = 0; j < 1000; j++ ) {
b[ i ][ j ] = "blah";
}
}
alert( "запомнил?" );
delete window.b;
alert( "а теперь должно освободиться место в памяти" );
Вывод, сборщик не всегда срабатывает после уничтожения объектов... то есть память может быть не освобождена перед использованием нового объекта. а сборщик мусора сделает свое дело тогда когда захочет.. Тоесть что null что delete не всегда эффективно... все зависит от интервала сборки мусора сборщиком. Тестил на Opera 11.60 как будет в других не смотрел. |
А обязательно очищать массив? Ведь браузер сам же очищает и без delete/null
|
Цитата:
Цитата:
|
devote,
переменную удалить нельзя, вы о чём вообще? У переменных configurable установлено в false, если конечно они не созданы через eval. |
Цитата:
|
| Часовой пояс GMT +3, время: 05:34. |