Javascript и память

beejuice

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

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

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

beejuice

Новичок
Расставляю нужные свойства через document.getElementById()

-~{}~ 11.02.09 18:59:

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

//Ждем ответа сервера
setTimeout(function waitOtvet() { if()... else setTimeout(waitOtvet, 100);}, 100);
 

serglt

Анус, ой, Ахтунг
А нафига она тебе вообще нужна? Нынче метод onreadystatechange - не в моде чтоли?
 

beejuice

Новичок
Автор оригинала: serglt
А нафига она тебе вообще нужна? Нынче метод onreadystatechange - не в моде чтоли?
Где-то попадалась статья, в которой утверждалось, что при такой конструкции у IE утечка памяти.

-~{}~ 11.02.09 19:34:

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

finction one(){

...

two();

}

function two(){

...

setTimeout('one()', 1000);

}
 

dimagolov

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

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

beejuice

Новичок
Автор оригинала: 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? Как они используют память?
 

Wicked

Новичок
beejuice
в том же, в чем между словами timeout и interval :)
первое - ждет один раз.
интервал - повторяет снова и снова.
 

beejuice

Новичок
А в чем разница указываешь ты название функции в кавычках

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

Или без

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

dimagolov

Новичок
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% если интервал будет короче времени исполнения вызываемого кода, правда, очередь не будет расти при этом бесконечно.
 

beejuice

Новичок
Проблема не решена...

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

function one(){

...

}

setInterval(one, 1000);

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

-~{}~ 11.02.09 21:31:

А у IE все нормально... похоже это проблема только в Фоксе...
 

dimagolov

Новичок
beejuice, FireBug активирован? если да, то проблема может быть в нем. отключи и посмотри на память.

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

-~{}~ 11.02.09 14:38:

да, и дергать one надо бесконечно? если нет, то надо запоминать полученный интервал и убивать его через clearInterval когда пора остановиться
 

beejuice

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

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

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

-~{}~ 11.02.09 21:54:

FireBug вообще не установлен тут.
 

HraKK

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