LINUX.ORG.RU

Браузеры съедают память.

 , ,


0

1

Есть один код.

<script type="text/javascript">
window.setInterval(function(){
	$(document).ready(function(){
        $('#load_this').load('/mydata/?groups=bu-5,bu-6,main_environment,podp,gu-gor-1000,gu-gor-800,');
	});
}, 4000);
</script>

<table width="100%" class="main">
    <tr valign="top"><td><div id="load_this"></div></td></tr>
</table>

Суть в том, что примерно за 14 часов IE с начальных 36MB начинает потреблять 1GB памяти. FF так вообще 1.5GB, но он и так отжирает больше 300.

Как починить?


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

trashymichael ★★★
()

noscript должен помочь))

dimon555 ★★★★★
()

Почему бы не использовать ajax, ну или iframe?

anonymous
()

Я помню, ещё полгода или год назад кто-то жаловался, что браузеры вообще не умеют собирать в качестве мусора удалённые и больше не нужные элементы DOM. Может быть, постоянное обновление HTML приводит к тому же.

Может быть, попробовать хотя бы загружать новый HTML, сравнивать со старым и добавлять на страницу только если он изменился? Или он реально каждые 4 секунды меняется?

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

Меняется. Пробовал удалять объект, в который загружаются данные и создавать заново, но тогда страничка «дергается», что не вариант.

qq6ka
() автор топика

Что этот говнокод предположительно должен делать? Зачем здесь setInterval? Нынче принято добавлять новые обработчики каждые четыре секунды?

anonymous
()

Естественно течёт, ты ж бесперерывно новые обработчики навешиваешь.

.ready вообще вызывается после первого DOMContentLoaded? Я что-то сомневаюсь.

Kalashnikov ★★★
()
Ответ на: комментарий от qq6ka
<script type="text/javascript">
$(function () {
  setInterval(function () {
    $('#load_this').load('/mydata/?groups=bu-5,bu-6,main_environment,podp,gu-gor-1000,gu-gor-800,');
  }, 4000);
});
</script>

<table width="100%" class="main">
    <tr valign="top"><td><div id="load_this"></div></td></tr>
</table>

Так пробовал?

theNamelessOne ★★★★★
()

перенеси анонимные функции в объект и дергай их как методы, не используй анонимные функции в setInterval

heisenberg ★★
()

Жаваскрипт хранит стэк фреймы в куче, как выше уже сказали. Т.е. хорошая новость заключается в том, память не течёт :) По идее, при превышении некоторого порога сборщик всё подчистит. Видимо, у тебя много памяти, поэтому он раньше времени не рыпается :)

Плохая новость — ничего с этим не поделаешь особо. Единственное, что можно попробовать — это заменить setInterval на setTimeout, если колбэк может отрабатывать дольше четырёх секунд.

Предлагаю провести эксперимент: уменьши объём памяти, отведённый фоксу, уменьши интервал где-нибудь до 10 мс и понаблюдай за графиком памяти в фаербаге. Если сборщик вовремя отреагирует, то можно не париться, я считаю.

Apple-ch ★★
()
Ответ на: комментарий от heisenberg

Объект то зачем. Просто функций (неанонимных) достаточно.

Also, такое ощущение, что ТС перепутал setInterval() с setTimeout().

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

ах да, процедурный подход. я уж и забыл, что такой существует :)

heisenberg ★★
()

Как починить?

<script type="text/javascript">
$(document).ready(function(){
  window.setInterval(function(){$('#load_this').load('/mydata/?groups=bu-5,bu-6,main_environment,podp,gu-gor-1000,gu-gor-800,');}, 4000);
});
</script>

<table width="100%" class="main">
    <tr valign="top"><td><div id="load_this"></div></td></tr>
</table>

Как-то примерно так. Не проверял, сразу в коммент написал, но смысл такой. Разница в том, что в твоём коде ты вешаешь в цикле обработчики на window.onload, которые ложатся в стек. А надо ложить один обработчик, который сам уже будет в цикле грузить аяксом некий контент.

Wizard_ ★★★★★
()

Скажи заказчику, что для серьёзных прилоджений нужно соответствующее железо. Оно сейчас дешёвое.

anonymous
()

Спасибо, парни.

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