Javascript и память

beejuice

Новичок
Javascript и память

Проблема такая, есть AJAX приложение, которое каждую секунду обращается к серверу, получает данные, обновляет страницу.

Проблема в том, что диким образом расходуется память. После каждой итерации отхватывает от 300 до 500 кб. Пробовал очищать массивы после того, как они отработают командой delete, но эффекта это не дало.
 
Расставляю нужные свойства через document.getElementById()

-~{}~ 11.02.09 18:59:

На данный момент грешу на вот эту конструкцию. Она находится внутри функции запроса к серверу.

//Ждем ответа сервера
setTimeout(function waitOtvet() { if()... else setTimeout(waitOtvet, 100);}, 100);
 
А нафига она тебе вообще нужна? Нынче метод onreadystatechange - не в моде чтоли?
 
Автор оригинала: serglt
А нафига она тебе вообще нужна? Нынче метод onreadystatechange - не в моде чтоли?
Где-то попадалась статья, в которой утверждалось, что при такой конструкции у IE утечка памяти.

-~{}~ 11.02.09 19:34:

И на такую конструкцию грешу. Очень грешу

finction one(){

...

two();

}

function two(){

...

setTimeout('one()', 1000);

}
 
beejuice
1. setInterval и clearInterval когда надо остановиться
2. не нужно формировать новую ф-ю при каждом вызове, так как
setInterval('one()', 1000); эквивалентно setInterval(new Function ('one()'), 1000); то есть правильно будет setInterval(one, 1000);

после п. 1 и 2 новые объекты если и будут создаваться, то только в самом коде ф-й one и two
 
Автор оригинала: dimagolov
beejuice
1. setInterval и clearInterval когда надо остановиться
2. не нужно формировать новую ф-ю при каждом вызове, так как
setInterval('one()', 1000); эквивалентно setInterval(new Function ('one()'), 1000); то есть правильно будет setInterval(one, 1000);

после п. 1 и 2 новые объекты если и будут создаваться, то только в самом коде ф-й one и two


Спасибо. Действительно видимо каждый раз создается "полный набор"...

Но запись setTimeout(one, 1000); Проблему не решает. Интересно себя ведет setTimeout(one(), 1000), запускается огромное кол-во новых функций, браузер тормозит, но используемая память не растет... :)

А в чем разница в работе между setTimeout и setInterval? Как они используют память?
 
beejuice
в том же, в чем между словами timeout и interval :)
первое - ждет один раз.
интервал - повторяет снова и снова.
 
А в чем разница указываешь ты название функции в кавычках

setInterval('one()', 1000);
setInterval('one', 1000)

Или без

setInterval(one(), 1000);
setInterval(one, 1000)
 
setInterval('one()', 1000);
// идентично setInterval(new Function ('one()'), 1000); - неявное создание анонимной ф-ии из строки, при вызове анонимной будет произведен вызов one()

setInterval('one', 1000)
// аналогично предидущему, но так как one это объект ф-ии то ничего исполнено не будет

setInterval(one(), 1000);
// будет попытка выполнить ф-ю полученную как результат исполнения one(). Если one не возвращает объект Function то будет ошибка

setInterval(one, 1000)
// произойдет вызов one

-~{}~ 11.02.09 14:14:

п.с. в JS все объекты (в том числе и ф-ии), а переменные это лишь ссылки на них. в любой момент любому объекту можно добавить свойства или убрать из него ссылки на другие объекты путем присваивания свойствам значения null

-~{}~ 11.02.09 14:22:

А в чем разница в работе между setTimeout и setInterval? Как они используют память?
На самом деле это ф-ии управления очередью исполнения JS. так как JS однопоточен, то каждый следующий блок может исполниться после завершения предыдущего, но никак не ранее

в свете вышесказаноого разница еще и в том, что если что-то поставлено в очередь исполнения через setTimeout, то оно будет исполнено в любом случае. Если в момент истечения задержки происходит исполнение другого блока, то назначенный по setTimeout вызов произойдет сразу после завершения предыдущего. А вот с setInterval иначе. Если к моменту следующего интервала предыдущий не начал исполнения, то вызов будет пропущен. Но это не помешает загрузить проц на 100% если интервал будет короче времени исполнения вызываемого кода, правда, очередь не будет расти при этом бесконечно.
 
Проблема не решена...

Сейчас структура выглядит так

function one(){

...

}

setInterval(one, 1000);

Память уходит только так...

-~{}~ 11.02.09 21:31:

А у IE все нормально... похоже это проблема только в Фоксе...
 
beejuice, FireBug активирован? если да, то проблема может быть в нем. отключи и посмотри на память.

ну и если загрузка проца 100%, то просто не успевает one отработать за 1сек, надо увеличивать интервал

-~{}~ 11.02.09 14:38:

да, и дергать one надо бесконечно? если нет, то надо запоминать полученный интервал и убивать его через clearInterval когда пора остановиться
 
one() нужно дергать бесконечно и желательно запускать следующий через секунду после завершения предыдущего.

one() успевает отработать. Я его даже пустым оставлял.

FireBug сейчас гляну.

-~{}~ 11.02.09 21:54:

FireBug вообще не установлен тут.
 
Да ФФ сам без ничего жрет дофига памяти. У него генеально количество мемори ликов. Через 2 часа пассивного серфинга мой ФФ жрет пол гига памяти.
 
Сверху