Javascript.RU

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

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

Еще один момент. Скорее всего придется оптимизировать код. Хотелось бы понять, что именно нужно оптимизировать. Если же у IE есть чудо-параметры среды выполнения JS, которых я не нашел, то это можно будет дать в качестве быстрого решения проблемы.

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

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование строк (касательно памяти) Hapson Общие вопросы Javascript 5 19.01.2014 13:18
Утечки памяти при использовании JSONP в IE 9 evgkar AJAX и COMET 3 28.12.2011 19:40
Выгрузка данных (переменных?) из памяти. Jurasmi Общие вопросы Javascript 5 31.12.2010 09:31
Как удалить из памяти весь XML документ? EisBerg Events/DOM/Window 1 03.04.2010 14:45
Утечки памяти: как сделать ? Draeden Events/DOM/Window 10 30.08.2009 18:16