2012-05-15 2 views
6

Я замечаю, что в моем приложении память, связанная с процессом IE, на Win7 поднимается на 20-30 МБ с обновлением каждой страницы. Как только я достиг около 1,5 ГБ, браузер перестает отвечать на запросы. Я использую IE9 и могу воспроизвести это только в IE9. Нет такой проблемы в Chrome, FF, IE7 или IE8. На самом деле проблема также не возникает при запуске IE9 в режиме совместимости.IE9 утечка памяти

В частности, мне интересно, как память может течь даже после обновления страницы. Кто-нибудь еще видел это?

+1

Это довольно сложная проблема для адреса. Я думаю, это может быть по многим причинам, извините :-( – Sebas

+1

Невозможно предоставить фрагменты кода для крупномасштабного приложения. Если бы я мог предоставить фрагменты, у меня уже был бы мой ответ, так как это потребовало бы, чтобы я сузил проблему на конкретную область кода. Как я уже сказал, я ищу других, которые столкнулись с той же ситуацией, что и я: утечка памяти даже после перезагрузки страницы (только для IE9), а также некоторые объяснения того, как это можно сделать произошли, в общем смысле. –

+0

Проверьте мой новый ответ Рэй, только что выяснил эту проблему сегодня (имел ту же проблему с новейшей версией продукта) –

ответ

3

В прошлом у Internet Explorer были проблемы со ссылками между обычными переменными JavaScript и объектами DOM. Итак, если я правильно помню, циклическая ссылка как этот

var e = document.createElement('div'); 
var x = { elementReference: e }; 
e.jsReference = x; 

бы не сборщиком мусора, даже если бы не было никаких других ссылок на e и x. Это связано с тем, что IE использовал различные методы сбора мусора для элементов DOM и JavaScript.

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

e.jsReference = null; 
x.elementReference = null; 

Edit: Тест в IE 8

Я написал эту простую тестовую страницу.

<html> 
    <head> 
    <title>Leak test</title> 
    <script> 
     function leak() { 
     var e = document.createElement('div'); 
     var x = { elementReference: e }; 
     e.jsReference = x; 
     } 

     function test() { 
     for (var i = 0; i < 10000; i++) 
      leak(); 
     alert('Done'); 
     } 
    </script> 
    </head> 
    <body> 
    <input type="button" value="test" onclick="test();" /> 
    </body> 
</html> 

Я тестировал это в IE 8, так как на этом компьютере не установлен IE 9. Тем не менее, это все еще может быть актуальным, поскольку это показывает, что проблема все еще присутствовала даже в довольно недавних версиях IE, и поэтому она может сохраняться даже в IE 9.

Я открыл страницу и просмотрел использование памяти. После каждого нажатия кнопки потребление памяти увеличилось на несколько МБ. После обновления веб-страницы абсолютно ничего не произошло. После закрытия IE использование памяти вернулось в исходное состояние.

Вы можете попробовать это для себя в IE 9. Конечно, вы, вероятно, не выделяете в свой код 10000 круговых ссылок объектов, но вы, вероятно, создаете более крупные объекты, которые могут содержать некоторую круговую ссылку, которую вы еще не нашли.

+0

Объяснит ли это, что быстро растущая память при каждой перезагрузке страницы? что вопрос о циклических ссылках между объектами-хозяевами и собственными объектами не будет объяснять увеличение объема памяти при каждой перезагрузке страницы. Кроме того, я явно не создаю никаких циклических ссылок. –

+0

@ user48 6979 Отредактировал мой ответ. – Imp

6

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

Если вы используете Modernizr (это должно быть исправлено сейчас в одном из самых последних выпусков, более 2.5+ я считаю), но если вы используете более старую версию (и не можете просто обновлять ее по какой-либо причине), тогда все, что вам нужно сделать, это заменить один оператор return.

Проблема происходит с Modernizr/геолокация & IE9, это на самом деле унаследуют проблема с IE9, не столько Modernizr.

return 'geolocation' in navigator 

вместо:

return !!navigator.geolocation // this causes the memory leak (silly IE9) 

https://github.com/Modernizr/Modernizr/issues/513

Посмотрите на эту ссылку, но в основном оператор возврата для теста геолокация должен быть изменен, и эта проблема будет исправить себя!

+1

Это была моя проблема, и ваше предложение спасло меня. Хорошо заслуженный подъем! –

+0

@ danradu в любое время :) Да, это немного меня заставило орехами ... рад, что это помогло кому-то еще! –

+1

Ничего себе ... такое простое решение проблемы, которая нас беспокоила какое-то время. Благодаря! –

Смежные вопросы