LINUX.ORG.RU

Обновление изображений посредством javascript без утечек памяти


0

2

Как это сделать? Гугл умалчивает, ссылаясь на глюки браузеров. Но не могут же все браузеры быть такими дырявыми?

Картинка обновляется функцией

	function refreshIMG(id, URL){
		var oldIMG = $(id);
		var newIMG = document.createElement("img");
		var parent = oldIMG.parentNode;
		newIMG.style.width = "100%";
		newIMG.src = URL;
		parent.insertBefore(newIMG, oldIMG);
		oldIMG.src = null;
		parent.removeChild(oldIMG);
		delete(oldIMG);
		newIMG.id = id;
	}

При этом, несмотря на все эти removeChild и delete, старая картинка остается в памяти. Добавление в шапку странички

<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="pragma" content="no-cache">
не помогает :(

Что делать-то? (мне и так пришлось добавить <meta http-equiv=«refresh» content=«600»>, чтобы браузер не падал, но очень некрасиво, когда вся страничка раз в 10 минут перезагружается...)

☆☆☆☆☆

Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от VirRaa

То же самое получается. Старые картинки из памяти не удаляются. За час, если убрать «refresh», отжирается ~100Мб памяти. За ночь браузер падает. А эта штука должна работать круглосуточно...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

P.S. Сколько всего картинок? Может сразу создать эти элементы, а потом через display их менять?

VirRaa ★★★
()

добавить в путь картинки ?rand - что то вроде /img/picture.jpg?42626236

так работает HXR для того чтобы не кешировать запросы

ex3me ★★
()
Ответ на: комментарий от VirRaa

Картинок до шести штук. Один-два jpeg'а и 0-4 SVG. iframe'ы делать не хочется.

через display их менять

Это как?

Картинки - текущие графики метеоусловий и изображения с камер. Раз в 20-30 секунд они должны меняться на более свежие.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от ex3me

Вы, возможно, не поняли проблему: новые картинки подгружаются (у jpeg'ов я добавляю "?«+Math.rand(), а у SVG параметры запроса и так изменяются, т.к. их генерирует сишный CGI), а вот старые не удаляются из памяти.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

header(«Content-Type: text/javascript; charset=windows-1251»);

header(«Expires: Thu, 01 Jan 1970 00:00:01 GMT»);

header(«Cache-Control: no-store, no-cache, must-revalidate»);

header(«Cache-Control: post-check=0, pre-check=0», false);

header(«Pragma: no-cache»);

На php делал такие заголовки, и не кешировало.

ex3me ★★
()
Ответ на: комментарий от Eddy_Em

>а вот старые не удаляются из памяти

Браузер менять надо. Во вменяемых браузерах, если с картинкой идёт заголовок, запрещающий её кешировать, она нигде не сохраняется.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

А, так это к картинкам надо добавлять? Тогда ничего поделать с этим не могу - SVG'шки генерируются моим CGI, и туда я могу что угодно в заголовок добавить, а вот картинки с камер - чужие (а одна вообще берется с метеостанции, которая что хочет, то и отдает)...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

А если убрать вконце запроса /img/pic.jpg?rand - картинка не обновляется если менять содержимое самой pic.jpg ?

ex3me ★★
()
Ответ на: комментарий от Eddy_Em

>А, так это к картинкам надо добавлять?

Не к _картинкам_, а веб-сервер должен отдавать соответствующий заголовок.

а одна вообще берется с метеостанции, которая что хочет, то и отдает


Сделать свой прокси, который добавит запрет кеширования?

KRoN73 ★★★★★
()
Ответ на: комментарий от ex3me

Естественно, в этом случае она не обновляется (несмотря на то, что генерируется и содержимое всегда разное).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от KRoN73

Ну, это уж чересчур...

Ну неужели все браузеры такие дырявые? Ведь элементарная же логика: если объект удалили, он должен быть удален и из памяти. Ан нет - его зачем-то продолжают хранить...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Я не о коде, хотел глянуть путь по которому сервер показывает картинки, увидеть сами заголовки. мне кажется их там просто нет/небудет.

ex3me ★★
()

Если в результате браузер валится или опается, возможно стоит написать багрепорт. Кэширование кэшированием, но глючить оно от этого не должно.

Deleted
()
Ответ на: комментарий от Deleted

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

Eddy_Em ☆☆☆☆☆
() автор топика

Можно сделать гибрид обновления картинок и рефреша: после какого-то числа обновлений картинки делать рефреш всей страницы. Или вставить саму картинку в фрейм/iframe и рефрешить его.

Можно попробовать костылять напропалую: поставить прокси между юзером и метеостанцией, который будет перекодировать картинку в Data URL, загружать ее с него XMLHttpRequest'ом и надеяться, что в этом случае утечки не будет.

proud_anon ★★★★★
()

> То же самое получается. Старые картинки из памяти не удаляются. За час, если убрать «refresh», отжирается ~100Мб памяти. За ночь браузер падает. А эта штука должна работать круглосуточно...

попробовал сделать тэст http://super-tmp1.narod.ru/2011-05-11-23-31-test-garbage-collection-for-img-src/ ..

интересно будет реально поймать броузер на том что он «забыл» удалить мусор :-)

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

однако Gravatar — отдаёт кортинки с «Cache-Control:max-age=300» ... это важно? %)

user_id_68054 ★★★★★
()

и ещё я так понмаю во всё этом деле — (для чистоты эксперимента) — главное не открывать инструментов разработчика [{ctrl}+{shift}{i} для Chromium и F12 для Mozilla]

не факт же что после закрытия Development-Tools объектная инфомарция перестанет сохраняться :)... лучше вообще переоткрыть-броузер-поновой и в чистом виде провести эксперимент (наблюдая за броузером из Манагера Процессов)

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

Так тоже делал. top показывает быстрое нарастание потребляемой памяти.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Olegymous

Вы в популярных браузерах смотрите. Что мне этот «завоеватель»? Сам проверить не могу: ни дома, ни на работе konqueror не работает (какие-то конфликты с кривыми кедобиблиотеками).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Olegymous

> Iceweasel. Память не течёт.

я — часть ночи проверял на Chromium ...(тоесть порядка 5~7 часов)..

через [shift]+[esc] потребление памяти от tab — дошло до 1.2G .. но ничего не зависло и не глюкнуло по сей момент

интересно 1.2G это предел или ещё будет расти :-) :-)

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

У меня всего 1ГБ на работе. Одновременно были открыты огнелис и хромой. Огнелис «капитулировал», хромой «упснул».

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от iMp

Интересно, оказывается, еще и запросы текут...

Но у меня проблема более явная - при обновлении изображений старые не удаляются из памяти.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

дауж... вот она погоня за производительность.... кто там в 10 раз быстрее, кто в 39... а самое главное забыли :-D

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

Да, он самый. Еще на багтрекере несколько упоминаний есть. Только никто их исправлять не собирается.

Кстати, оказалось, что шапка «Cache-Control: no-store» приводит к еще большей утечке памяти :)

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от user_id_68054

1.2ГГ это уже ненормально. я память не ворую, например, и мне жалко даже полгига отдавать хрому только за то, что ему влом чистить её.

алсо предлагаю жабафагам рассказать о преимуществе сборки мусора перед подсчетом ссылок

ckotinko ☆☆☆
()
Ответ на: комментарий от ckotinko

> 1.2ГГ это уже ненормально. я память не ворую, например, и мне жалко даже полгига отдавать хрому только за то, что ему влом чистить её.

ну вот например у меня — савакупный размер linux-swap — составляет 25G .. и пусть программы забивают этот своп — чем хотят :-) ..

самое главное-то чтобы программы не падали изза переполнения своего _индивидуального_ адрессного пространства :-)

(Chromium конешно не падает весь полностью, но его вкладки-то!)

user_id_68054 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.