macro и micro memory management. Java и С
От: c-smile Канада http://terrainformatica.com
Дата: 03.12.05 02:49
Оценка: 94 (10) +2
В продолжение темы C++ vs ???
Автор: zip_
Дата: 30.11.05


Постулат №1:
GC это хорошо и malloc/free тоже хорошо.

В поисках идеала (для UI programing) пришел к следующему выводу:
GC как средство макроменеджмента памяти это то что нужно.
GC как средство микроменеджмента памяти это дрова.
Микроменеджмент памяти это прерогатива malloc/free и stack allocation.

Что есть macro и micro management? Поясню на примере:

Классический () подход современных Java или WinForms.net:

Скажем для того чтобы залить прямоугольгик каким-нибудь цветом мы имеем:


class Brush { Color color; ... }

class Graphics 
{  
  void fillRect( Rect r );
}

Brush b = new Brush( new Color(0xFF,0,0) ); 
Rect r = new Rect( 10,10,100, 100 );

gfx.setBrush(b);
gfx.fillRect(r);


В данном случае Java выполняет менджмент микро объектов Rect и Brush — создает и удаляет их. Как следствие система жутко не эффективная. Как правило Brush это обертка над системным HBRUSH в конце концов. Т.е. к тому же имеем еще и dispose со всеми вытекающими.
Brush как отдельный объект никому не нужен. Как правило все что с ним делается это вызывается конструктор и все.
Rectangle в общем-то тоже как самостоятельный объект представляет мало ценности. Тогда зачем они? (см. далее про j-smile)

Постулат №2:

Если некая GC система (runtime например) требует интенсивного explicit dispose это
означает ошибку в дизайне этой самой системы/runtime.
Код требующий dispose нужно выносить на уровень микроменеджмента.

Что я попытался сделать в j-smile (микро/макро был одной из основных идей дизайна):
тот же фрагмент кода выглядит так:


// class Brush { Color color; ... } - просто нет этого как сущности
// Color тоже нет. Вернее есть, но не как объект, а namespace для стат. функций. 

class Graphics 
{  
  void fillRect( int x, int y, int w, int h );
}

gfx.setBrush(Color.RGB(0xFF,0,0));
gfx.fillRect(10,10,100, 100);


Менеджмент HBRUSH и всего такого (микроменеджмент) выполняет
С имплементация класса Graphics. Заведомо максимально эффективным образом.
Java же управляет макро объектами Windget, Widgets (container) и т.д.

Все вместе а) значительно снижает нагрузку на GC (мало объектов — мало мусора)
b) значительно снижает требования к самой VM Java — все интенсивные
вычисления делаются на стороне C.
Если посомтреть то j-smile-demo.exe
(самописная VM + copying GC) тактильно работает в общем-то c той же скоростью что
и Harmonia примеры ( D c крутым codegen ). И объем exe в общем-то идентичен.
j-smile-demo.exe это двоичный bundle: 200k(VM+runtime) + 200k bytecodes (noncompressed .class files)
Откомпилированные D самплы по размеру бинарников соизмеримы.


Постулат №3
Оптимальная система оптимально использует разные
механизмы memory managment.
"Все — managed" это имхо грубейшая ошибка дизайна которая например убила Java UI на корню.
.NET UI (WinForms) слепо содрав подход AWT/SWT успешно двигается в
том же самом направлении.

Вот такие вот мои мысли в слух если они кому интересны.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.