спиртом, кофем, или сигаретами. еще помогают медитации.
а по делу - так как вы не сказали какую память и от кого чистить - самый простой фокус состоит в истользовании обьектов или других автономных обьектов - убил все ссылки на обьект и его память пожирается коллектором.
исходные коды библиотек также можно таким образом обертывать
загружаю 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); });
var listener = YMaps.Events.observe(placemark, placemark.Events.Load, function () {
map.removeAllOverlays(); listener.cleanup(); listener = null;
map.addOverlay(placemark); });
Вы каждые 5 минут создаете новый слушатель событий, а старый не удаляете. Он по-прежнему пытается слушать предыдущие экземпляры плэйсмарка, тем самым сохраняя их в памяти.
В данном случае не поможет. YMaps.Events.observe создает объект IObserver, который будет находиться в памяти до тех пор, пока ему не будет вызван cleanup(). Т.к. этот объект содержит внутри ссылку на обозреваемый элемент, то и он не будет удален GC, пока сущестсвует Observer.
дурацкий вопрос на 5 балов - map.destructor() - судя по всему не убивает ивенты, раз сам ими кидается. Слабо сделать Map.terminator или map.devastator который сотрет все (известные ему) данные, ноды графики маркеров, которые были замечены на этой карте и так далее... Тоесть "сафасем" придушит карту.
Использовать симметричные методы: add/remove, load/unload, enable/disable. Второй метод должен располагаться сразу за первым и производить те же действия в обратном порядке. Таким образом можно визуально отследить забытый слушатель или не обнулённую переменную.