
Java programátor expert
Java je populárny programovací jazyk, ktorý sa používa na vývoj komplexných aplikácií. Jedným z bežných problémov s programami v Jave je vysoká spotreba pamäte, ktorá môže spôsobiť problémy s výkonom a v extrémnych prípadoch dokonca pády aplikácií. Či už si Java developer alebo Java programátor senior určite tak vieš, že je dôležité používať techniky šetrenia pamäte na optimalizáciu kódu v Jave a zníženie spotreby pamäte všade tam, kde je to možné. V tomto článku si prejdeme niektoré z najlepších postupov a tipy na úsporu pamäte v Jave.
Výber vhodnej dátovej štruktúry má významný vplyv na efektivitu a rýchlosť programovania v Jave. Napríklad uprednostnenie LinkedList pred ArrayList môže byť výhodné, ak často pridávaš alebo odstraňuješ položky zo zoznamu, pretože má pre tieto operácie konštantnú časovú zložitosť na rozdiel od lineárnej časovej zložitosti ArrayList.
HashMap, TreeSet a PriorityQueue je niekoľko ďalších efektívnych dátových štruktúr, ktoré je vhodné podľa danej situácie vo svojich programoch používať. Využitím týchto dátových štruktúr môžeš zlepšiť celkový výkon kódu Java.
Metódy by nemali byť príliš dlhé a mali by byť zamerané na vykonávanie jedinej funkcie. Je to lepšie nielen pre údržbu, ale aj výkon, pretože počas načítavania triedy a počas volania metódy sa metóda načítava do pamäte zásobníka. Ak sú metódy veľké a obsahujú príliš veľa príkazov, spotrebúvajú pri vykonávaní vo výraznejšej miere pamäť aj cykly CPU. Preto sa pokús rozbiť dlhé metódy na menšie, logické celky.
Neustále vytváranie objektov v Jave môže spotrebovať veľa pamäte a spomaliť tvoj kód, pretože alokovanú a už nepoužívanú pamäť je potrebné recyklovať. Kedykoľvek je to možné, skús opätovne použiť existujúce veci, než vytvárať nové. Jednou z techník na dosiahnutie tohto cieľa je združovanie objektov (angl. pooling), čo je udržiavanie sady opakovane použiteľných objektov, ktoré si možno podľa potreby požičať a vrátiť.
Ako alternatívu k opakovanému vytváraniu nových objektov, môžeš použiť napríklad návrhový vzor Flyweight.
Flyweight je návrhový vzor, ktorý sa používa na zdieľanie objektov a zníženie spotreby pamäte. V tomto príklade môžeš opakovane používať rovnaký kľúčový objekt namiesto vytvárania nového pri získavaní hodnoty zo zoznamu. Týmto spôsobom môžeš ušetriť pamäť tým, že znížiš počet vytvorených objektov.
Reťazec v Jave je nemenná trieda a objekt vytvorený pomocou String nemožno opätovne použiť. Pozrime sa na nasledovný riadok kódu:
V tomto príklade potrebuješ spojiť niekoľko reťazcov do jedného. Problém je v tom, že Java vytvorí pre každý reťazec najskôr objekt typu String a až potom ich spojí. Aby si sa tomu vyhol, dá sa pre spájanie textových reťazcov použiť StringBuilder.
Použitie primitívnych typov je preferované pred objektmi, pretože údaje primitívneho typu sú uložené v pamäti zásobníka (stack memory) a objekty sú uložené v pamäti haldy (heap memory). A práve prístup k údajom do pamäte zásobníka je oveľa rýchlejší ako do heapu.
Autoboxing je automatická konverzia primitívnych typov na ich zodpovedajúce obalové objekty. To však môže spôsobiť zbytočné vytváranie objektov a prebytočné náklady na pamäť. Namiesto toho môžeš použiť metódu valueOf() objektu Integer, aby si sa vyhol autoboxingu a znovu použil existujúce objekty.
Vieme, že trieda BigDecimal poskytuje vysokú presnosť pre výpočty s desatinnými číslami. Avšak nadmerné používanie týchto objektov drasticky obmedzuje výkon, najmä keď sa používa v cykloch. BigDecimal využíva na vykonávanie výpočtov veľa pamäte v porovnaní s typmi long a double. Ak presnosť nie je hlavným kritériom alebo ak si si istý, že rozsah vypočítanej hodnoty nepresiahne long alebo double, môžeš sa vyhnúť použitiu BigDecimal a namiesto toho použiť long alebo double so správnym pretypovaním.
Namiesto inicializácie zoznamu objektov pri načítaní triedy môžeš použiť takzvanú oneskorenú inicializáciu objektov. To znamená, že inicializácia objektov (a teda aj alokovanie pamäte) sa odloží až do času kým to nebude potrebné. Týmto spôsobom môžeme ušetriť pamäť tým, že sa vyhneš vytváraniu zbytočných objektov.
Namiesto používania kolekcie ArrayList môžeš použiť jednoduché pole, keď poznáš počet elementov vopred. Týmto spôsobom môžeš ušetriť pamäť tým, že sa vyhneš nákladom na dynamické zväčšovanie/zmenšovanie a ďalším metódam potrebných na inicializáciu kolekcie.
Vždy sa usiluj využiť vytvorené objekty opakovane a nevytváraj zbytočne nové, ak to nie je nevyhnutné.
V tomto príklade namiesto vytvárania nového ArrayListu pre každú iteráciu cyklu môžeš rovnaký objekt opakovane používať tým, že ho vyčistíš po každom použití. Týmto spôsobom môžeš ušetriť pamäť tým, že znížiš počet vytvorených objektov.
Metóda intern() je metóda triedy String, ktorá vráti kanonické zobrazenie reťazca. Použitím intern() môžeš zabezpečiť, že sa vytvorí len jedna inštancia reťazca, aj keď je ten istý reťazec vytvorený viackrát. Týmto spôsobom môžeš ušetriť pamäť tým, že znížiš počet vytvorených reťazcov.
Použitím týchto techník šetrenia pamäte môžeš optimalizovať kód v Jave, aby bol efektívnejší a spotreboval menej pamäte.
Je však dôležité mať na pamäti, že optimalizácia pamäte by nemala ísť na úkor čitateľnosti alebo udržateľnosti kódu. Vývojári by mali starostlivo zvážiť kompromisy medzi spotrebou pamäte a kvalitou kódu, aby sa zabezpečilo, že ich aplikácie budú výkonné a spoľahlivé.
Ak ovládaš Java programovanie a hľadáš prácu, pozri si naše firemné benefity a reaguj na naše voľné pracovné ponuky.