Массив картинок подтекает - PullRequest
1 голос
/ 19 октября 2011

Это то, что я делаю. У меня есть постоянно растущий массив фотографий pictures для слайд-шоу фотографий. Я показываю картинку i следующим образом:

pictures[i]
   .fadeIn(500)
   .delay(5000)
   .fadeOut(500, function () {
        $(this).remove();
        delete this;
   });

Несмотря на мои попытки очистить память с помощью .remove() и delete, у меня все еще есть утечка памяти. Я что-то не так делаю?

1 Ответ

1 голос
/ 19 октября 2011

Обновление

Согласно комментариям ниже, это было проверено в Chrome, и браузер, похоже, удерживает память из изображений до тех пор, пока страница больше не будет активно отображаться (перезагружена, переключена вкладка и т. Д.). К сожалению, это относится и к Firefox и IE.

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

Я не проверил ваш код досконально, поэтому не уверен, можно ли как-то избежать этой проблемы (она не выглядит так при первом проходе), хотя вы должны помнить, что вы постоянно добавляете признаки к когда-либо -растущий массив, который будет продолжать использовать все больше и больше памяти самостоятельно. Возможно, это ссылка в массиве, которой можно придерживаться, которого можно было бы избежать, если вы нашли другой способ реализации слайд-шоу.

Причина, по которой я предполагаю, может быть в следующем: сборка мусора с помощью node.js . Браузерный сборщик мусора должен гарантировать, что они недоступны (что они всегда есть, так как массив постоянно растет). Таким образом, вам нужно подождать, пока сборщик мусора очистит значения <img> внутри индексов, чтобы освободить память, и это не обязательно произойдет, когда вы установите для них значение null.


Вам нужно будет передать свой итератор i в функцию обратного вызова. После этого вы сможете обнулить изображение после того, как оно исчезнет, ​​и освободить используемую память. Просто убедитесь, что вы не попали в общую проблему замыкания-итератора - что-то вроде этого должно работать:

pictures[i].fadeIn(500).delay(5000).fadeOut(500, (function(i) {
    pictures[i] = null;
})(i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...