GWT управление памятью
От: _LeShik Беларусь  
Дата: 14.01.09 14:28
Оценка: 3 (1)
Всем доброго времени суток

Вопрос для гуру GWT: "Как правильно писать GWT код чтобы не получать постоянный расход памяти под IE?"
У нас приложение средних размеров (~10-15 форм). Проблема в том что работая с приложением в IE, браузер постоянно занимает всё больше и больше памяти. При этом он либо вообще не освобождает память, либо освобождает не полностью.
Был замечен такой факт: при нажатии на кнопку refresh, IE освобождает практичеки всю память, и возвращается к показателям которые были при открытии страницы.

Дошло до того что мы написали простейший тест: создавали панель, добавляли на неё несколько тысяч разных стандартных компонентов (кнопок, чекбоксов, текстовых полей, и т.д.), после этого мы добавляли эту панель в RootPanel, и удаляем её оттуда. При создании и добавлении панели в RootPanel, браузер дополнительно алоцирует ~ 5 MB памяти, после удаления панели освобождает ~ 4.8 MB. Т.е. за каждый цикл не освобождается порядка 200KB. В тесте не используются Event-ы, listeners, DOM класс, нет native методов. Ни Microsoft js memory leaks detector, ни sIEve не показывает утечек памяти в javascript, но факт остаётся фактом, после минут 20 повторения циклов теста, браузер дополнительно занимает от 10 до 15 MB памяти.

Кто сталкивался с подобными проблемами и знает способ как их решить ваша помощь была бы очень кстати ...
Re: GWT управление памятью
От: toxin Россия  
Дата: 14.01.09 14:41
Оценка:
Здравствуйте, _LeShik, Вы писали:

вы бы хоть код привели и версию GWT озвучили. В GWT 1.4 я на довольно сложном приложении с подобным не сталкивался, утечки были но не значительные.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: GWT 1.5.2
От: _LeShik Беларусь  
Дата: 14.01.09 14:48
Оценка:
Да упустил. GWT 1.5.2.
У нас утечки тоже поначалу незначительны, но учитывая что всё приложение работает без перезагрузки стараницы и имеет один Entry Point, со временем после интенсивной работы утечки становятся заметными.

Здравствуйте, toxin, Вы писали:

T>Здравствуйте, _LeShik, Вы писали:


T>вы бы хоть код привели и версию GWT озвучили. В GWT 1.4 я на довольно сложном приложении с подобным не сталкивался, утечки были но не значительные.
Re: GWT управление памятью
От: aectann  
Дата: 14.01.09 15:16
Оценка:
Здравствуйте, _LeShik, Вы писали:

_LS>Всем доброго времени суток


_LS>Вопрос для гуру GWT: "Как правильно писать GWT код чтобы не получать постоянный расход памяти под IE?"


Старайтесь создавать меньше элементов интерфейса, вместо создания новых элементов старайтесь просто заменять содержимое старых.
Re: GWT управление памятью
От: Cyberax Марс  
Дата: 14.01.09 15:26
Оценка:
Здравствуйте, _LeShik, Вы писали:

_LS>Был замечен такой факт: при нажатии на кнопку refresh, IE освобождает практичеки всю память, и возвращается к показателям которые были при открытии страницы.

Тут две проблемы:
1) Фрагментация кучи.
2) Циклические ссылки.

Фрагментация кучи постепенно приводит к росту занимаемой памяти. Вторая проблема — это циклические ссылки, которые вызывают утечки COM-объектов. GWT умеет их разрывать, но для этого требуется переход между страницами
Sapienti sat!
Re[2]: GWT управление памятью
От: _LeShik Беларусь  
Дата: 14.01.09 15:57
Оценка:
Здравствуйте, aectann, Вы писали:

Гм, тоже пробовали. К сожалению подход не всегда применим, особенно когда инетрфейс строится динамически на основании данных с сервера.
Кроме того при росте приложения, память всё равно будет расходоваться (т.е. создадутся все элементы, и будут висеть в памяти).
Мы ищем вариант когда память будет выделятся и полностью освобождаться (если это вообще возможно в IE).

A>Здравствуйте, _LeShik, Вы писали:


_LS>>Всем доброго времени суток


_LS>>Вопрос для гуру GWT: "Как правильно писать GWT код чтобы не получать постоянный расход памяти под IE?"


A>Старайтесь создавать меньше элементов интерфейса, вместо создания новых элементов старайтесь просто заменять содержимое старых.
Re[2]: GWT управление памятью
От: _LeShik Беларусь  
Дата: 14.01.09 15:59
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, _LeShik, Вы писали:


_LS>>Был замечен такой факт: при нажатии на кнопку refresh, IE освобождает практичеки всю память, и возвращается к показателям которые были при открытии страницы.

C>Тут две проблемы:
C>1) Фрагментация кучи.
C>2) Циклические ссылки.

Большая просьба, если есть какие нибудь доки по этой теме, либо можешь словами объяснить поподробнее что к чему буду очень благодарен.

C>Фрагментация кучи постепенно приводит к росту занимаемой памяти. Вторая проблема — это циклические ссылки, которые вызывают утечки COM-объектов. GWT умеет их разрывать, но для этого требуется переход между страницами
Re[3]: GWT управление памятью
От: Cyberax Марс  
Дата: 14.01.09 20:19
Оценка:
Здравствуйте, _LeShik, Вы писали:

C>>Тут две проблемы:

C>>1) Фрагментация кучи.
C>>2) Циклические ссылки.
_LS>Большая просьба, если есть какие нибудь доки по этой теме, либо можешь словами объяснить поподробнее что к чему буду очень благодарен.
Словами... В общем, первая проблема достаточно простая — если мы создаём и удаляем много объектов, то в непрерывных блоках памяти, которые используются для распределения этих объектов, у нас могут появляться "дырки".

Вторая проблема — сложнее. Все GUI-объекты и узлы DOM в IE представлены как COM-объекты. А в COM-е используется подсчёт ссылок. И если сделать цикл из объектов, использующих подсчёт ссылок, то они будут жить вечно.

Это очень известная проблема: http://msdn.microsoft.com/en-us/library/bb250448.aspx , http://foohack.com/2007/06/msie-memory-leaks/ и вообще поищи по словам "reference counting IE memory leak".
Sapienti sat!
Re[4]: GWT управление памятью
От: _LeShik Беларусь  
Дата: 15.01.09 08:58
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, _LeShik, Вы писали:


C>>>Тут две проблемы:

C>>>1) Фрагментация кучи.
C>>>2) Циклические ссылки.
_LS>>Большая просьба, если есть какие нибудь доки по этой теме, либо можешь словами объяснить поподробнее что к чему буду очень благодарен.
C>Словами... В общем, первая проблема достаточно простая — если мы создаём и удаляем много объектов, то в непрерывных блоках памяти, которые используются для распределения этих объектов, у нас могут появляться "дырки".

Как я понимаю, ввиду отсутсвия javaScript API для работы с памятью, никак повлиять на это я как девелопер не могу. Т.е. получается что в случае если IE аллоцирует память и после этого освобождает не всю то всё что можно сделать — пенять на браузер.

C>Вторая проблема — сложнее. Все GUI-объекты и узлы DOM в IE представлены как COM-объекты. А в COM-е используется подсчёт ссылок. И если сделать цикл из объектов, использующих подсчёт ссылок, то они будут жить вечно.


C>Это очень известная проблема: http://msdn.microsoft.com/en-us/library/bb250448.aspx , http://foohack.com/2007/06/msie-memory-leaks/ и вообще поищи по словам "reference counting IE memory leak".


Да много читал об этой проблемме, но есть довольно сильное подозрение что это не циклические ссылки. Во первых в тестовом приложении не было ничего что может вызвать такие проблеммы, ни native функций, ни Listener-ов, не работаем с DOM напрямую (через DOM, Document классы), а GWT клятвенно обещает что их компоненты не текут (по причине циклических ссылок) http://code.google.com/p/google-web-toolkit/wiki/DomEventsAndMemoryLeaks . ДА и ни sIEve ни Microsoft Js memory leak detector не находят никаких элементов с циклическими сылками.

Похоже пенять придётся только на Browser.
В любом случае спасибо за объяснение по фрагментации памяти, может быть ещё есть какаой нить способ заставить IE фрагментировать память принудительно, или посмотреть насколько память фрагментирована, не слышал про такие туулы ???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.