Добрый день, коллеги!
Описание проблемы начну издалека. На проекте у нас используется фреймворк SmartGWT. То есть пишем мы на Java, потом этот код компилируется в JS, и на клиенте работает именно он. Проблема появляется в IE 9.0.8112.16421. В "нормальных" браузерах ее нет. ОС Windows 7 32b, ОЗУ 4ГБ. Она состоит в том, что если в грид, в котором есть много колонок, грузить "много" данных, то выдается ошибка браузером "SCRIPT7: Недостаточно памяти". Что такое "много"? Точной цифры нет. Но, например, 50 строк грузятся без проблем, а со 100 строками возникают проблемы. Причем 100 строк могут загрузиться, а могут и не загрузиться. То есть проблема плавающая.
Есть скрипт на JS, который вызывает подобную проблему. Выкладываю сразу в страничке:
<html>
<head>
<script type="text/javascript">
function LeakMemory(){
var first = 10000;
var second = 2000;
for(i = 0; i < 100; i++){
console.log(i);
var parentDiv = document.createElement("<div onClick='foo()'/>");
parentDiv.bigString = new Array(first).join(new Array(second).join("XXXXX"));
}
}
</script>
</head>
<body>
<input type="button" value="Memory Leaking Insert" onclick="LeakMemory()" />
</body>
</html>
Запускаю через F12 консоль разработчика. Запускаю скрипт нажатием на кнопку на страничке и получаю в консоли аналогичное сообщение "SCRIPT7: Недостаточно памяти". Причем ругается на строчку
parentDiv.bigString = new Array(first).join(new Array(second).join("XXXXX"));
в которой происходит выделение памяти. Вывод в консоль номера итерации показателен. При одинаковых значениях first и second, ошибка вылетает на разных итерациях.
Если ошибка у Вас не проявляется увеличьте параметр first, second или оба.
И собственно вопрос: как объяснить такое поведение? Кому не хватает памяти? Есть ли какой-то параметр, чтобы ее увеличить?
Вариант не использовать IE не подходит, потому что мы официально его поддерживаем и он используется в банке.
У меня есть недостаток понимания того, каким образом работает JS в браузерах, потому что я не специализируюсь на нем. Это затрудняет анализ. Было бы хорошо, если бы Вы скинули пару ссылок "для чайников".
С уважением,
Евгений