В прошлом у 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 круговых ссылок объектов, но вы, вероятно, создаете более крупные объекты, которые могут содержать некоторую круговую ссылку, которую вы еще не нашли.
Это довольно сложная проблема для адреса. Я думаю, это может быть по многим причинам, извините :-( – Sebas
Невозможно предоставить фрагменты кода для крупномасштабного приложения. Если бы я мог предоставить фрагменты, у меня уже был бы мой ответ, так как это потребовало бы, чтобы я сузил проблему на конкретную область кода. Как я уже сказал, я ищу других, которые столкнулись с той же ситуацией, что и я: утечка памяти даже после перезагрузки страницы (только для IE9), а также некоторые объяснения того, как это можно сделать произошли, в общем смысле. –
Проверьте мой новый ответ Рэй, только что выяснил эту проблему сегодня (имел ту же проблему с новейшей версией продукта) –