SCRIPT7: Недостаточно памяти
Добрый день, коллеги!
Описание проблемы начну издалека. На проекте у нас используется фреймворк 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 в браузерах, потому что я не специализируюсь на нем. Это затрудняет анализ. Было бы хорошо, если бы Вы скинули пару ссылок "для чайников". С уважением, Евгений |
Еще один момент. Скорее всего придется оптимизировать код. Хотелось бы понять, что именно нужно оптимизировать. Если же у IE есть чудо-параметры среды выполнения JS, которых я не нашел, то это можно будет дать в качестве быстрого решения проблемы.
С уважением, Евгений |
Интересно, что увеличение числа успешных итераций происходит после перезагрузки браузера. Такое ощущение, что IE сбрасывает какой-то кэш, а потом потихоньку начинает гадить в него. После чего и возникают проблемы.
С уважением, Евгений |
| Часовой пояс GMT +3, время: 11:18. |