JavaScript + теги img = утечка памяти. Существует ли лучший способ сделать это?

На самом деле это сложный вопрос, потому что такие приложения, как Telegram и WhatsApp, вероятно, имеют несколько логических обработчиков, очень сложную логику.

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

  • Для обмена сообщениями используется некоторый протокол реального времени. Telegram использует собственный проприетарный протокол, WhatsApp использует XMPP.
  • когда обе стороны находятся в сети (отправитель и получатель), то в режиме реального времени доставляется сообщение XMPP. В основном & amp; обычно приложение имеет постоянное соединение TCP / TLS / WSS с сервером чата, в основном, когда пользователь использует его.
  • когда получатель не в сети (не подключен к серверу чата), например не использует приложение (приложение находится в фоновом / приостановленном режиме), тогда push-уведомления будут доставлены. И это только для уведомления пользователя о появлении нового сообщения. Затем пользователь (получатель) открывает приложение и получает реальное сообщение (через XMPP-соединение в реальном времени) или через синхронизацию с сервером по API REST / HTTP.

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

8
задан Dustin 3 December 2008 в 06:23
поделиться

7 ответов

Можно ли попытаться изменить src последнего ребенка и видеть ли, имеет ли это значение? Можно затем переместить тот элемент, чтобы быть первым ребенком

//not tested

var $list=$('#shots>li');
$list.filter(':last-child').children('img')
.attr('src', p.ProductImageSmall)
.parent()
.insertBefore( $list.eq(0) );
1
ответ дан 5 December 2019 в 23:17
поделиться

От центра разработки Mozilla на removeChild():

Удаленный дочерний узел все еще существует в памяти, но больше не является частью DOM. Можно снова использовать удаленный узел позже в коде через oldChild ссылку на объект.

Это - ключ - снова используют удаленного ребенка, вместо того, чтобы неоднократно делать нового.

// I'm sure there is a nicer way to do it in jQuery
if(number_of_things_seen > 10) {
  var shots = document.getElementById("shots");
  var li    = shots.getElementsByTagName("LI");
  var move  = shots.removeChild(li[li.length-1]);
  move.getElementsByTagName("IMG")[0].src = p.ProductImageSmall;
  shots.insertBefore(move, li[0]);
}
1
ответ дан 5 December 2019 в 23:17
поделиться

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

см. http://pastebin.me/4936458820c43

0
ответ дан 5 December 2019 в 23:17
поделиться

сколько времени Вы наблюдали этот 'рост неограниченно долго'? некоторые реализации сборщиков "мусора" не обязательно отдают память к ОС так быстро если вообще. можно ли дистиллировать то, что Вы пытаетесь сделать в реальный простой тест (например, устанавливая src изображения много раз) w/o ajax или обратные вызовы? Вы имеете / можно ли попробовать этот w/другие браузеры?

0
ответ дан 5 December 2019 в 23:17
поделиться

Dustin, кажется, что insertBefore оператор в моем коде вызывал некоторые проблемы. Если Вы видите этот дальнейший тестовый сценарий, использование памяти остается довольно статичным даже при том, что я освобождаю последнего ребенка и вставляю новый новый dom фрагмент. Работает лучше, чем последняя попытка.

http://pastebin.me/4936519fea2cf

0
ответ дан 5 December 2019 в 23:17
поделиться

Браузеры печально известны утечками памяти. Похоже, проблема возникает, когда страница остается запущенной в течение длительного времени. Как насчет обновления страницы до того, как она исчерпает память?

window.setTimeout("location.reload()",1000*60*60);//refresh in an hour
2
ответ дан 5 December 2019 в 23:17
поделиться

Является ли след действительно проблемой?

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

Причина такого поведения в том, что Safari считает вероятным, что эти изображения используются во второй раз, и поэтому кэширует их.

1
ответ дан 5 December 2019 в 23:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: