Описание: Память, выделяемая в процессе работы приложения, освобождается медленно (если освобождается вообще). При интенсивном использовании htmlayout и загрузке страниц с большими рисунками (и тем более, если их много) расходуется вся память. Программа падает.
В процессе тестирования обнаружил удивительную вещь — памяти выделяется в 2 раза больше, чем размер всех загружаемых рисунков (в моем тесте за каждый клик расходуется 140 мб, картинки весят 70 мб). Так специально сделано или все-таки тоже баг?
Здравствуйте, Lazarus, Вы писали:
L>Нашел баг, сделал тест для его выявления. исходники на С# + бинарник (размер архива 1,3 Мб)
L>Описание: Память, выделяемая в процессе работы приложения, освобождается медленно (если освобождается вообще). При интенсивном использовании htmlayout и загрузке страниц с большими рисунками (и тем более, если их много) расходуется вся память. Программа падает. L>В процессе тестирования обнаружил удивительную вещь — памяти выделяется в 2 раза больше, чем размер всех загружаемых рисунков (в моем тесте за каждый клик расходуется 140 мб, картинки весят 70 мб). Так специально сделано или все-таки тоже баг?
L>-- L>Lazarus
Проблема где-то в nabu — скорее всего при загрузке нового документа не освобождается (HTMLayout_UnUse()) root элемент предыдущего
документа.
В browse.exe накопления памяти нет (жмем F5 для воспроизводства).
"обнаружил удивительную вещь — памяти выделяется в 2 раза больше"
Все в общем-то тривиально: каждый загруженный image это массив raw bytes *плюс* аллоцированная dib section.
В случае BMP (незжатый image) это как раз и дает двукратную память. Используем png или jpeg и будет счастье.
Здравствуйте, c-smile, Вы писали:
CS>Проблема где-то в nabu — скорее всего при загрузке нового документа не освобождается (HTMLayout_UnUse()) root элемент предыдущего документа.
Здравствуйте, Lazarus, Вы писали:
CS>>Проблема где-то в nabu — скорее всего при загрузке нового документа не освобождается (HTMLayout_UnUse()) root элемент предыдущего CS>>документа.
L>Root элемент (в обертке это объект типа HtmlTag) даже не создается. Проверено .NET Profiler-ом. L>В такой цепочке: L>
L>вообще ни одного объекта типа HtmlTag не создается.
Ну значит какие-нибудь byte buffers не освобождаются.
Судя по тому что память примерно удваивается то это что-то связанное с буферами картинок или сылкой на root node где-то.
Здравствуйте, c-smile, Вы писали:
CS>Ну значит какие-нибудь byte buffers не освобождаются. CS>Судя по тому что память примерно удваивается то это что-то связанное с буферами картинок или сылкой на root node где-то.
Nabu вообще говоря пофиг что грузить, всё идёт как byte[]. Соответственно никакой обработки (опирающихся на unmanaged код объектов Image/Bitmap) нет. Единственное исключение, это протоколы res и resx, но это не наш случай. Managed Memory Profilers молчат. Если подскажешь что-то, я посмотрю.
А так, managed на то и managed что всё видно, а у тебя чёрный ящик. Вот мы на тебя и грешим
Здравствуйте, adontz, Вы писали:
A>Nabu вообще говоря пофиг что грузить, всё идёт как byte[]. Соответственно никакой обработки (опирающихся на unmanaged код объектов Image/Bitmap) нет. Единственное исключение, это протоколы res и resx, но это не наш случай. Managed Memory Profilers молчат. Если подскажешь что-то, я посмотрю. A>А так, managed на то и managed что всё видно, а у тебя чёрный ящик. Вот мы на тебя и грешим
Прогнал под debug c вашим примером. В момент загрузки нового документа висят две внешние ссылки на root. Они его и держат.
Здравствуйте, c-smile, Вы писали:
CS>Прогнал под debug c вашим примером. В момент загрузки нового документа висят две внешние ссылки на root. Они его и держат.