Клуб API Карт

память

adlertaxi
1 марта 2010, 21:23

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

14 комментариев
Подписаться на комментарии к посту
спиртом, кофем, или сигаретами.
еще помогают медитации.

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

исходные коды библиотек также можно таким образом обертывать
загружаю ie- 15-20Мб занимает, после пары часов - 500-600Мб

function map() {
    placemark = new YMaps.KML("http://...../12345.kml");
               YMaps.Events.observe(placemark, placemark.Events.Load, function () {
                map.removeAllOverlays(placemark);
                map.addOverlay(placemark);
                });
  
  setTimeout("map();", 5000);     
и это я так думаю не ИЕ8 :)
попробуйте через час работы удалить обьект YMaps, при желании создать его обратно - полторы секунды с загрукой тайлов
ИЕ8 и в CHROME
А попробуйте вот так:

var listener = YMaps.Events.observe(placemark, placemark.Events.Load, function () {
   map.removeAllOverlays();
   listener.cleanup();
   listener = null;
   map.addOverlay(placemark);
});

Вы каждые 5 минут создаете новый слушатель событий, а старый не удаляете. Он по-прежнему пытается слушать предыдущие экземпляры плэйсмарка, тем самым сохраняя их в памяти.
по-прежнему память растет на глазах, что то надо еще удалять,а что и как???...
вариант 1 - сохраняйте все приходяшие к вам плейсмарки, и после removeAllOverlays стирайте их на прямую

вариант 2 - сохраняйте плейс марки в другом окне, через час рефрешите окно и скачивайте данное заново

В данном случае не поможет. YMaps.Events.observe создает объект IObserver, который будет находиться в памяти до тех пор, пока ему не будет вызван cleanup(). Т.к. этот объект содержит внутри ссылку на обозреваемый элемент, то и он не будет удален GC, пока сущестсвует Observer.
дурацкий вопрос на 5 балов - map.destructor() - судя по всему не убивает ивенты, раз сам ими кидается.
Слабо сделать Map.terminator или map.devastator который сотрет все (известные ему) данные, ноды графики маркеров, которые были замечены на этой карте и так далее...
Тоесть "сафасем" придушит карту.
 Map.terminator   map.devastator  -- Объект не поддерживает это свойство или метод
логично, правильнее было бы написать Terminator.invoke(map) или $.2012.devastateOn(map);
но это либы - закрытые военные разработки
terminator.invoke(map)   --   Ошибка: 'terminator' - определение отсутствует
Мы думаем над этим :)
Использовать симметричные методы: add/remove, load/unload, enable/disable. Второй метод должен располагаться сразу за первым и производить те же действия в обратном порядке. Таким образом можно визуально отследить забытый слушатель или не обнулённую переменную.