Publikoval Michal Kočí dňa 1.2.2006 o 23:25 v kategórii Ostatné
Nie že by som chcel alebo musel migrovať z .Net na Javu, ale okolnosti ma prinútili naprogramovať svoju prvú Javovú aplikáciu. Respektíve prvú a nultú, pretože pred prvou aplikáciou som si musel, jednoducho musel, naporgramovať aj Hello World. Pokladal som to za svoju povinnosť...
Začnem tým, prečo som vlastne potreboval napísať Java aplikáciu. Všimli sme si, že jedna Java aplikácia hostovaná v Internet Exploreri neúnosne zväčšuje jeho pamäťové nároky. Jedná sa o applet, ktorý zobrazuje dokumenty uložené vo FileNet-e. IE si po štarte ukusne približne 30 MB a po zobrazené zopár dokumentov narastie obsadenie pamäte približne na 70 - 100 MB. Jasné, 100 MB nie je až také hrozné na novších počítačoch, problém je, že máme snahu migrovať užívateľov na terminálový server. Ak by na ňom nastával tento jav a u 50 užívateľov by si IE odkusol po 100 MB pamäte, tak by to server nemusel rozchodiť. I keď s Javou nemám nič dočinenie, podozrenie padlo na Garbage Collector. Toto som chcel overiť a chcel som vynútiť GC ku kolekcii nepotrebných objektov. Že moja snaha k ničomu nakoniec neviedla je už asi zrejmé, že?
Prvým predpokladom k tomu, aby som mohol napísať nejakú Java aplikáciu bolo zohnať nejaký Java compiler. Bol som popravde milo prekvapený, že Sun dáva k voľnému stiahnutie kompiler a aj vývojové prostredie - NetBeans IDE + JDK 5.0. Veľkosť inštalačného balíka je približne 130 MB, inštaláciu na disku niečo okolo 300 MB.
Prostredie stiahnuté rýchlo, inštalácia až priveľmi jednoduchá. Inštalátor totiž nainštaluje všetko, užívateľ si môže akurát vybrať cielový adresár. Fajn, aj tak by som nevedel čo je čo a nainštaloval by som si pre istotu všetko.
Na rad prišiel Hello World. Jednoducho mi to prišlo ako celkom logický prvý krok v mojom oboznamovaní sa s Javou. Aj Hello World, aj moju ďaľšiu aplikáciu som zvlásol celkom rýchlo aj vďaka zbežnému preklikaniu sa cez Learning the Java Language, aj vďaka Google.
Hello world:
public class GCRunApp { public static void main(String[] args) { System.out.println("Hello World"); } }
Garbage Collector Run:
public class GCRunApp { public static void main(String[] args) { System.out.println("Trying to force garbage collect..."); System.gc(); } }
Čo som teda od tohto programu očakával? Očakával som, že jeho spustením sa mi podarí GC prinútit prečistiť pamäť a čakal som, že pamäť používaná IE klesne. Keby sa tak ozaj stalo, tak by som vedel, že pamäť narastá kvoli GC a vedel by som, že sa u terminálov nebudeme mať čoho báť - že keď narastie celkovo spotrebovaná pamäť, Java sama vo vhodný okamžik spustí Garbage Collect. To že sa tak nestalo môže mať dva dôvody. Prvý dôvod, Garbage Collector nespustil prečistenie pamäte. Rovnako ako v .Net ani v Jave sa nedá GC vynútiť, iba o neho požiadať. To či reálne nastane je na samotnej Jave. Druhý dôvod, Garbage Collector sa spustil, ale problém so zvýšenou požiadavkou na pamäť nie je spôsobená nevyužívanými objektmi v pamäti.
Takže keď zhrniem dnešný môj pokus, tak záver je, že nikam neviedol. Pravú príčinu som pamäťového nárastu som sa nedozvedel, ale aspoň som si letom-svetom pozrel vývojové prostredie Javy...
Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.