Pull to refresh

Internet Explorer + Flash Player + IE Skype Add-on = Memory Leak

Reading time3 min
Views2.3K
В течении нескольких лет мы (anychart.com) периодически получаем баг-репорты, суть которых сводится к тому, что память в Internet Explorer 6/7 (и Flash Player 9/10 в нем) ужасно течет при рефреше страницы. Долго и упорно мы пытались найти решение этой проблемы, теряли клиентов, не спали ночами. Со временем IE + Flash Player стали моим ночным кошмаром. Мы материли и Adobe и Microsoft, но никак не могли подумать, что они тут не при чем.
Сегодня случилось чудо. При очередном тесте на двух одинаковых машинах появилась разница — на одной утечка памяти была, на другой нет. Долгий и упорный brainstorming нашел корень всех зол. Им оказался… Internet Explorer Skype add-on!

-----
Update:
Со мной связались из скайпа. Добовление к посту
Peter Kalmström, PM Skype Toolbars:
1. This is how you disable only the add-on www.screencast.com/t/BrlWxmckTd3. We don't want users removing Skype
2. We are working closely with Skype to get a fix out asap — watch this space!
-----
One more update:
Пост на английском в нашем блоге: www.anychart.com/blog/2009/07/27/anychart-has-discovered-bug-in-skype-skype-promises-to-fix-it-asap-2

Далее были проведены эксперименты, которые показали, что при установленном Skype add-on-е память растет при каждом рефреше/закрытии страницы с ЛЮБОЙ! swf-кой.

Итак, подтверждение диагноза.



Что мы имеем


Окружение

Чистая Vista SP1 x86 eng, запущеная в VMWare workstation.
Internet Explorer 7.0.6001.18000
Flash Player WIN 10,0,22,87 non-debug, установленный как ActiveX через заход на сайт адоба ( get.adobe.com/flashplayer ). Версия проверялась здесь: kb2.adobe.com/cps/155/tn_15507.html

Пациент

Пустой SWF файл, собраный под 9-й Flash Player. Его код:
package {
    import flash.display.Sprite;

        class SimpleSWF extends Sprite {
            public function SimpleSWF() {
        }
    }
}

Тестовая страница со встроеной с помощью swfobject 2.2 swf-кой:
anychart.com/batsuev/flash-memory-leak/index.html

Тестовая страница со встроеной ручками swf-кой
anychart.com/batsuev/flash-memory-leak/index1.html

Пустая страница
anychart.com/batsuev/flash-memory-leak/empty.html

Операция


Как проводились измерения: На vmware была установлена Vista SP1 x86 eng, далее был установлен последний Flash Player.
IE открывался с помощью командной строки:

iexplore «тут адрес страницы»

Далее в нем упорно давился F5 с выжиданием 15 секунд между апдейтами.

Итак, сравнение пустой страницы и её 20-и рефрешей с и без skype add-on-а:



Особого роста использования памяти в принципе нет и ничего страшного не происходит.

Теперь откроем страницу со встроеной через <object> Flash-кой:



~2 мегабайта на каждый рефреш страницы. Закрытие таба не помогает, помогает только перезапуск IE.

Теперь то же самое, но будем использовать swfobject для встраивания swf:



Получим примерно те же 2 мегабайта прироста на рефреш.

(Немного пиара: графики нарисованы anychart-ом через Save as image)

Выводы


При установленном Skype плагине Flash Player ActiveX не очищает за собой память.
При пустой swf-ке рост составляет 2 мегабайта на каждый рефреш/покидание страницы.

Паника


Убеждаемся, что skype add-on включен, открываем youtube, смотрим на память. У меня получилось 28.8 мегабайта. Просматриваем небольшой ролик длительностью 1 минуту. Память становится ~53 мегабайта. Переходим на about:blank — память чуть чуть уменьшается до 50 мегабайт.

UPDATE: Internet Explorer 8 ведет себя так же
Tags:
Hubs:
Total votes 74: ↑70 and ↓4+66
Comments37

Articles