Имеется WinForm Application, состоящая только из одного WebBrowser control'a.
Контрол постоянно общается с хостером (WinForm'a) через window.external (передаются объекты .NET'a в JavaScript)
Где-то в этом всём есть большие утечки памяти (до 1Мб в минуту).
Как с этим можно бороться и откуда вообще утечки, если и в .NET'e и в JavaScript'e свои GC?
Здравствуйте, Darkman_CV, Вы писали:
D_C>Имеется WinForm Application, состоящая только из одного WebBrowser control'a. D_C>Контрол постоянно общается с хостером (WinForm'a) через window.external (передаются объекты .NET'a в JavaScript)
D_C>Где-то в этом всём есть большие утечки памяти (до 1Мб в минуту).
Разве это большие. За 2 часа отъедается около 100 метров. У меня IE за это время весит порядка 300-400 мегабайт.
D_C>Как с этим можно бороться и откуда вообще утечки, если и в .NET'e и в JavaScript'e свои GC?
Здравствуйте, TK, Вы писали:
TK>Здравствуйте, Darkman_CV, Вы писали:
D_C>>Как с этим можно бороться и откуда вообще утечки, если и в .NET'e и в JavaScript'e свои GC?
TK>Для начала надо определиться с тем что именно утекает. После этого уже можно будет думать над тем как с этим можно бороться.
Возможно я не совсем корректно выразился, но хотелось бы понять, как выяснить, что является виновником данной ситуации.
Наблюдения показывают, что после вызова WebBrowser::Navigate количество используемой памяти резко уменьшается, а на новой странице она опять "утекает".
На каждой странице существует Javascript Objects. Для понимания проблемы, объясню на пальцах (кода под рукой нет).
Объект "транспорт": имеет учередь "сообщений", отправляемых через AJAX
(это необходимо для синхронной отправки сообщений)
Выглядит так:
var queue = new Array();
queue.push(new StateReport());
далее, по таймеру очередь проверяется и отправляется.
Объект StateReport() — это объект, который сам сеарилируется в XML.
Некоторые данные получает через window.external.getValueOne(), некоторые из состояний объектов на странице.
Грешу именно на JS т.к. переход со страницу на страницу — вызывает освобождение памяти.
Мне вот интересно, насколько надо иметь "большой ум" (типа, "от большого ума"), чтобы наворотить такого архитектурного Франкенштейна? Тут тебе и JS, AJAX, WebNavigator и... WinForms!...
А потом еще удивляются "и шо у меня тут такое?".
Не-е, это диагноз.
Помять у тебя освобождается при переходе из-за того, что наконец-то наступает тот счастливый момент, когда уже можно удалить всю ту JS/AJAX/XML-байду, которую ты туда напихал. Это никакие не "утечки памяти", а нерациональное ее использование и неправильное использование технологий вообще. Сериализация вообще воздуха не озонирует в плане использования памяти. AJAX тоже. Чего ты хочешь, если при использовании XML объем "сопроводиловки" каждого байта составляет дясятки-сотни РАЗ от "полезной информации".
JS в броузере не умеет освобождать ресурсы, потому всё то барахло, которое ты насовал туда, там и хранится до того "благословенного момента", когда броузер уходит с того адреса и всё становится, наконец-то, никому ненужным.
Плодите Франкенштейнов дальше!...
How can men die better than facing fearful odds,
For the ashes of their fathers and the temples of their gods?
Здравствуйте, BlackTigerAP, Вы писали:
BTA>JS в броузере не умеет освобождать ресурсы, потому всё то барахло, которое ты насовал туда, там и хранится до того "благословенного момента", когда броузер уходит с того адреса и всё становится, наконец-то, никому ненужным.
Вы ошибаетесь. А java-script-е есть сборка "неиспользуемых" объектов.
BTA>Плодите Франкенштейнов дальше!...
BTA>[i]данное сообщение получено с www.gotdotnet.ru
Здравствуйте, Darkman_CV, Вы писали:
D_C>Здравствуйте, Nimnul, Вы писали:
N>>JS/AJAX/XML - обойдусь без слов, но вы поняли, что я подумал об этом
D_C>Спасибо за содержательный ответ
Ты недавно на рсдн? Почитай посты г-на Nimnul и для тебя подобные его "ответы" перестанут быть неожиданностью. Если же научишься не отвечать на его провокации, а потом — даже не читать, то получишь от форума кроме трепа еще и пользу.
Что же до проблемы, могу предложить отделить мух от котлет и погонять по отдельности составные части на предмет памяти. Я лично не удивлючсь, если IE что-то освобождает только при переходе со страница на страницу — может он расчитан не на AJAX, а на стандарное обновление страниц.
Отладишь кусок с WebBrowser-ом, потом подключай его к WinForm-ам и разбирайся с их сюрпризами. Вот так пошагово есть шанс найти причину.