Показать сообщение отдельно
  #1 (permalink)  
Старый 28.02.2014, 15:45
Новичок на форуме
Отправить личное сообщение для Ordjo Посмотреть профиль Найти все сообщения от Ordjo
 
Регистрация: 28.02.2014
Сообщений: 3

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 в браузерах, потому что я не специализируюсь на нем. Это затрудняет анализ. Было бы хорошо, если бы Вы скинули пару ссылок "для чайников".

С уважением,
Евгений
Ответить с цитированием