Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Динамическая подгрузка и ВЫГРУЗКА скрипта... (https://javascript.ru/forum/events/33794-dinamicheskaya-podgruzka-i-vygruzka-skripta.html)

digitalbrain 08.12.2012 16:57

Динамическая подгрузка и ВЫГРУЗКА скрипта...
 
Если писать веб приложение на JS то возникает необходимость подгрузки скриптов во время выполнения...да подгрузить вопросов нет...

this.script=$C('script','',head);
   this.script.type="text/javascript";
   this.script.onreadystetechange=function()     {if(this.readyState=='complete')this.onLoaded();}.bind(this);
   this.script.onload=function(){this.onLoaded();}.bind(this);
   this.script.src=this.Source;


но вот высвободить его с памяти никак...удаляешь его DOM узел , src в '' и сам объект в null все ровно браузер его не освобождает...и даже святой бубен не помогает..
Тут то и проблема, если скриптов всего 10 подгружаемых (не одновременно конечно)...ну то пусть в памяти остаются, но если их скажем 100 разных держать в памяти сотню мб изврат..:stop:

Есть пока идея подгружать сам код через ajax потом динамически создавать функцию =new Function(code) и выполнять в ней код подгружаемого модуля..по окончании работы вызывать специальный метод модуля для деинициализации чтоб по удалять все им созданные функции и потом подчищать внешние ссылки на него...ну на подобие модуля того ж делфи..
В принципе оно как то работает в черновой реализации...правда наверно где то утечка памяти есть ибо при 1000 циклов подгрузки - выгрузки модуля уходит мб с 30-40 озу...
и очевиден минус - так как это не скрипт как таковой - не будет кеширования кода...хотя модули по 30 кб конечно стягивать заново не проблема..0,5 сек дела то )
Может есть какие то готовые реализации принципа погрузки-выгрузки кода? Не изобретаю ли я велосипед часом?:-?

danik.js 08.12.2012 17:57

Так а почему бы просто не удалять ссылки на объекты, созданные подгруженным скриптом ? И что у вас за приложение на 100 файлов?

cyber 08.12.2012 18:22

digitalbrain, ну как бы браузер не моментально освобождает ресурсы и еще вы уверены что у вас не осталось ссылок на объект ?

digitalbrain 08.12.2012 22:26

Цитата:

Сообщение от cyber (Сообщение 220292)
digitalbrain, ну как бы браузер не моментально освобождает ресурсы и еще вы уверены что у вас не осталось ссылок на объект ?

Ну.. в принципе не должно оставаться...я рекурсивно все в null и delete делаю потом..лучше лишний раз пройтись..вообщем рву все связи с излишком..
насчет сборщика мусора - это я знаю...конечно когда постоит страница без дела некоторое время, то память возвращается потихоньку, но все ровно мб 10 утекают наверно..сложно понять что утекло, а что просто держит браузер до лучших времен..
вот жеш не могут нормальную отладочную софтину сделать чтоб в лоб писало что в памяти есть и куда она распределена...

digitalbrain 08.12.2012 22:35

Цитата:

Сообщение от danik.js (Сообщение 220288)
Так а почему бы просто не удалять ссылки на объекты, созданные подгруженным скриптом ? И что у вас за приложение на 100 файлов?

Да думал так в лоб сделать...Но смутило что может на каждый такой скрипт расходуется еще какая то память браузера кроме явной, и даже если все созданные объекты обнулить то "скрипт" как системный объект браузера останется в памяти...ну просто файрбаг его все ровно показывает и фик знает то ли он его просто сохранил для меня или он действительно еще в памяти висит.. тут надо решить что больше зло ...хотя так было бы куда легче чем с аджаксом..
Странно что разработчики сделали динамическое добавление скриптов , а вот про очистку без бубна не подумали..
П.С ну приложение это весь сайт гг страниц то много все с разными функциями..можно и по старинке бы, но тут спортивный интерес :)

cyber 08.12.2012 22:44

digitalbrain, вы не можете заставить браузеры принудительно вызывать сборщик мусора( можно только в ие) , а пока он не отработает то память не очиститься.

cyber 08.12.2012 22:48

а насчет загрузки кода ajax , то обьекты удаляются тем же сборщиком мусора, так что эффект будет тот же.

Маэстро 10.12.2012 14:17

У меня аналогичная проблема в веб-приложении. Пока что я пришел к выводу, что с этим придется смириться :( Но хуже всего в IE. Память постепенно накапливается и когда доходит до 300 МБ (почему именно 300 - не знаю) - браузер практически сваливается! он как бы продолжает работать, но при этом не отображает ни одной картинки! (почему это вылезает именно на картинках - тоже не знаю).
Чисто из практики (для IE) могу посоветовать, что если есть возможность заменить массивы [] на объекты {}, то лучше используйте объекты


Часовой пояс GMT +3, время: 16:30.