Out of memory

Апокалипсис

тех дир matras.ru
Out of memory

При работе с ajax чатом (если много сообщений загружено в оперативку) выскакивает ошибка
Out of Memory (т.е. не хватает памяти). Как с этим бороться? Давать принудительную команду на window.reload();? Или есть еще какие способы очистки? (не полной а постепенной)

-~{}~ 27.08.06 15:56:

P.S. И в IE в процессах память бежит вверх каждую сек по 10 кб...

-~{}~ 27.08.06 18:02:

Так быстро забивается память только в IE может это особенность IE?

-~{}~ 27.08.06 20:23:

Неужели никто не сталкивался с этим?
 

Апокалипсис

тех дир matras.ru
Prototype'овский класс Ajax.PeriodicalUpdater (или просто обновление блока по timeout через window.setTimeout) приводит к утечке памяти в IE. Если окно достаточно долго повисит открытым, то потом на очистку памяти (средствами Prototype'а) очень много времени может уходить и кажется, что браузер намертво завис. Нормального лекарства не нашел пока
Аха
Бочонок
спасиб за ссылку...
P.S. Но может кто нибудь нашел это лекарство? Или все на оперу пересаживать?!

-~{}~ 29.08.06 23:54:

И все таки, каким способом можно очистить память в IE кроме как закрыть его окно... за час в процессах 50 мег ...
 

Igor aka TiGR

Новичок
Какая версия prototype используется? Насколько я понмю они фиксили утечки в Ajax.periodialUpdater.
 

maxwell

artifex
Автор оригинала: Апокалипсис
Аха
Бочонок
спасиб за ссылку...
P.S. Но может кто нибудь нашел это лекарство? Или все на оперу пересаживать?!

-~{}~ 29.08.06 23:54:

И все таки, каким способом можно очистить память в IE кроме как закрыть его окно... за час в процессах 50 мег ...
странно, я юзаю вот такие вот связки

PHP:
PeriodicalExecuter.prototype.registerCallback = function() {
	this.intervalID = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
}
и все работает, проверяно много сотен раз на разных машинах
 

maxwell

artifex
frequency - константа, несложно догадатся, к примеру 5, это значит что след запрос через 5 секунд пойдет)

функция стопа
PHP:
PeriodicalExecuter.prototype.stop = function() {
	clearInterval(this.intervalID);
}
юзать примерно так
PHP:
// Инициализация :)
this.pe = new PeriodicalExecuter(this.function_name.bind(this), this.interval);
// Стоп
this.pe.stop();
-~{}~ 30.08.06 00:58:

могу ошибатся, писалось давно и вроде я это даже откуда-то списал (была статья вроде где-то)
 

Апокалипсис

тех дир matras.ru
Я prototype не использую, я классы вообще не использую... может все нужно "вогнать" в класс и делать так?

-~{}~ 31.08.06 16:45:

maxwell
дай ссылку поглядеть как у тебя...
P.S. Почему то локально если использовать ajax то нет утечки :(
 

maxwell

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

но в принципе ты могешь делать window.location="yourpage.html?messages=vasya pupkin: hello!;pupkin vasja: fcuk!;";
что то такое, и потом разбирать строку в начале своего скрипта...

Таким образом и память очистишь и месаги сохранишь
А если у тебя загружаются они из базы каждый раз при старте то вообще не надо парица а тупо reload'ить
 

Апокалипсис

тех дир matras.ru
нет тут по другому... мессаги берутся из базы
рефреш не нужен, по таймауту задается время выполнения ф-ции которая соединяется с севрером принимает и выводит html уже....

maxwell
хех а если другие потырят? :)
 

netmac

Новичок
Код надо смотреть твой.
Скорее всего в результате периодического вызова функции запроса данных у тебя плодятся переменные, или ответные данные и забивают память.

Ты проверял зависимость сожраной памяти от количества вызовов процедуры запроса данных? Есть связь?
 

netmac

Новичок
Глюк ie? Как сказать. Сомневаюсь очень сильно.

Погонять этот код не могу т.к. очень долго его привязывать и разбираться что куда - лень.

Для начала я бы посоветовал не создавать каждый раз объект XMLHttpRequest в функции gchat, а создать его один раз и использовать потом.

И подумай где тебе точно нужны переменные без var, а где с var. И там где можно использовать локальные переменные, т.е. с var, используй их.
 

Апокалипсис

тех дир matras.ru
хм вот проблема если я задаю XMLHttpRequest один раз то память скачет резко бывает за 5 минут до 70 мег в процессах ... а если его задавать внутри ф-ции и вызывать каждый раз по таймауту расходуется как ни странно меньше памяти .....
 

netmac

Новичок
Еще вопросик:
Почему у тебя в функции getHTTPObject после успешного создания объекта в цикле for ты не выходишь из него, а продолжаешь создавать объеты?
 

Апокалипсис

тех дир matras.ru
Да это я вообще скопировал так посмотреть что лучше

Код:
function getHTTPObject() {


    var request = null;

    if(!request) try {
        request=new ActiveXObject('Msxml2.XMLHTTP');
    } catch (e){}

    if(!request) try {
     request = new ActiveXObject("Microsoft.XMLDOM");
      } catch (e){}
    if(!request) try {
        request=new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e){}

    if(!request) try {
        request=new XMLHttpRequest();
    } catch (e){}


    return request;
}
с этой ф-цией раньше работал, ту поставл для теста...

-~{}~ 31.08.06 23:53:

вот сейчас только что мерил дошло до 50 и сбросилось до 15 мб... это после того как я XMLHttpRequest засунул в gchat();
 

netmac

Новичок
Ты начни с упрощения чтобы понять где собака зарыта.
Оставь пока 'Microsoft.XMLHTTP' скажем.
 
Сверху