Hlavní navigace

Java a nativní paměť

30. 3. 2014 22:37 zboj

V .NET máme v podstatě zadarmo možnost obejít p-invoke a přistupovat k nativnímu kódu přímo z C#. Mnohdy je ale problémem pouze zacházení s pamětí a o nativní (resp. C(++)) kód nám vůbec nejde. V takovém případě máme k dispozici neřízenou haldu.

V Javě máme to samé, jen se o tom tolik neví. Samozřejmě bychom mohli k efektivnímu zacházení s pamětí použít JNI nebo JNA, ale mnohem multiplatformnější je využít třídu sun.misc.Unsafe. Už podle jména je jasné, že je určena jen pro experty (takže tak 2–3% javistů), ale výhody pak stojí za to.

Předně nám umožňuje alokovat paměť mimo haldu JVM (a tedy mimo GC). Typickým použitím je například rychlá serializace objektů. Metoda allocateMemory alokuje paměť a vrátí adresu vyhrazeného bloku. Metoda freeMemory blok uvolní. Je zřejmé, že si musíme dávat pozor na správné uvolnění alokované paměti, proto by se takový kód měl vždy vyskytovat v konstrukci

try (...) {...}

C++/CLI je sice v tomto podstatně dále, ale stále se jedná o velmi užitečnou a často používanou techniku, která aspoň částečně pomáhá vyvážit nevýhody GC. Skutečně výkonné aplikace se často spouští schválně s malou haldou, aby bylo k dispozici co nejvíce nativní paměti pro efektivní zacházení s ní.

P.S. Nebyla by to Java, kdyby vývojáře něčím neznechutila. Vytvoření objektu Unsafe je neuvěřitelně stupidní a i tak má překladač spoustu keců. Ale při vhodném zapouzdření se to dá zkousnout.