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, время: 03:21. |