память и рисунки
От: Lazarus  
Дата: 18.02.08 14:37
Оценка:
Нашел баг, сделал тест для его выявления. исходники на С# + бинарник (размер архива 1,3 Мб)

Описание: Память, выделяемая в процессе работы приложения, освобождается медленно (если освобождается вообще). При интенсивном использовании htmlayout и загрузке страниц с большими рисунками (и тем более, если их много) расходуется вся память. Программа падает.
В процессе тестирования обнаружил удивительную вещь — памяти выделяется в 2 раза больше, чем размер всех загружаемых рисунков (в моем тесте за каждый клик расходуется 140 мб, картинки весят 70 мб). Так специально сделано или все-таки тоже баг?

--
Lazarus
Re: память и рисунки
От: c-smile Канада http://terrainformatica.com
Дата: 18.02.08 21:02
Оценка:
Здравствуйте, 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 и будет счастье.
Re[2]: память и рисунки
От: adontz Грузия http://adontz.wordpress.com/
Дата: 19.02.08 12:11
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Проблема где-то в nabu — скорее всего при загрузке нового документа не освобождается (HTMLayout_UnUse()) root элемент предыдущего документа.


Новый HTML устанавливается вот так
this._html = (value == null) ? string.Empty : value;

if (base.IsHandleCreated)
{
    byte[] htmlData = HtmlProtocolBase.BinaryDataFromString(this._html);
                    
    if (this._baseUrl != null)
    {
        NativeMethods.Window_LoadHtmlEx(base.Handle, htmlData, htmlData.Length, this._baseUrl);
    }
    else
    {
        NativeMethods.Window_LoadHtml(base.Handle, htmlData, htmlData.Length);
    }
}


NativeMethods.Window_LoadHtml это HTMLayoutLoadHtml
NativeMethods.Window_LoadHtmlEx это HTMLayoutLoadHtmlEx

Root как и любой HtmlTag реализует IDisposable со всеми вытекающими...
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: память и рисунки
От: Lazarus  
Дата: 19.02.08 15:04
Оценка:
CS>Проблема где-то в nabu — скорее всего при загрузке нового документа не освобождается (HTMLayout_UnUse()) root элемент предыдущего
CS>документа.

Root элемент (в обертке это объект типа HtmlTag) даже не создается. Проверено .NET Profiler-ом.
В такой цепочке:
htmlView.LoadHtml(...);
//Sleep(1000);
htmlView.LoadHtml(...);

вообще ни одного объекта типа HtmlTag не создается.
Re[3]: память и рисунки
От: c-smile Канада http://terrainformatica.com
Дата: 19.02.08 17:11
Оценка:
Здравствуйте, Lazarus, Вы писали:

CS>>Проблема где-то в nabu — скорее всего при загрузке нового документа не освобождается (HTMLayout_UnUse()) root элемент предыдущего

CS>>документа.

L>Root элемент (в обертке это объект типа HtmlTag) даже не создается. Проверено .NET Profiler-ом.

L>В такой цепочке:
L>
L>htmlView.LoadHtml(...);
L>//Sleep(1000);
L>htmlView.LoadHtml(...);
L>

L>вообще ни одного объекта типа HtmlTag не создается.

Ну значит какие-нибудь byte buffers не освобождаются.
Судя по тому что память примерно удваивается то это что-то связанное с буферами картинок или сылкой на root node где-то.
Re[4]: память и рисунки
От: adontz Грузия http://adontz.wordpress.com/
Дата: 19.02.08 21:13
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Ну значит какие-нибудь byte buffers не освобождаются.

CS>Судя по тому что память примерно удваивается то это что-то связанное с буферами картинок или сылкой на root node где-то.

Nabu вообще говоря пофиг что грузить, всё идёт как byte[]. Соответственно никакой обработки (опирающихся на unmanaged код объектов Image/Bitmap) нет. Единственное исключение, это протоколы res и resx, но это не наш случай. Managed Memory Profilers молчат. Если подскажешь что-то, я посмотрю.
А так, managed на то и managed что всё видно, а у тебя чёрный ящик. Вот мы на тебя и грешим
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: память и рисунки
От: c-smile Канада http://terrainformatica.com
Дата: 21.02.08 01:09
Оценка: 33 (1)
Здравствуйте, adontz, Вы писали:

A>Nabu вообще говоря пофиг что грузить, всё идёт как byte[]. Соответственно никакой обработки (опирающихся на unmanaged код объектов Image/Bitmap) нет. Единственное исключение, это протоколы res и resx, но это не наш случай. Managed Memory Profilers молчат. Если подскажешь что-то, я посмотрю.

A>А так, managed на то и managed что всё видно, а у тебя чёрный ящик. Вот мы на тебя и грешим

Прогнал под debug c вашим примером. В момент загрузки нового документа висят две внешние ссылки на root. Они его и держат.
Re[6]: память и рисунки
От: adontz Грузия http://adontz.wordpress.com/
Дата: 21.02.08 04:55
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Прогнал под debug c вашим примером. В момент загрузки нового документа висят две внешние ссылки на root. Они его и держат.


Ай-ай-ай. Будем посмотреть.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: память и рисунки
От: adontz Грузия http://adontz.wordpress.com/
Дата: 05.03.08 20:48
Оценка: 54 (2)
Здравствуйте, adontz, Вы писали:

A>Ай-ай-ай. Будем посмотреть.


Посмотрел, поправил. Всем рекомендую обновить библиотеку.
A journey of a thousand miles must begin with a single step © Lau Tsu
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.