Nedávno pracujem na programe pre Javu. Pôvodne sa mi vždy páčila správa pamäte v Jave, nemusíš sa starať o alokáciu pamäte, stačí alokovať, garbage collector ti pamäť získa späť. Teraz je program vyvinutý s veľkým množstvom dát a kvôli rýchlosti načítam všetky informácie do pamäte, čo zabezpečí rýchlu reakciu. Stále opakovane počítam pamäť a myslím na vlastné množstvo dát, ktoré by malo na začiatku stačiť (môj počítač má 4G pamäť, hoci Windows rozpoznáva 3,5G, ale malo by to byť v poriadku v porovnaní s mojím aktuálnym objemom dát).
Nečakane program prvého experimentu bežal niekoľko hodín a narazil na výnimku Out of Memory. Keď som sa pozrel na nastavenia vlastného VM, nastavil som -Xms512M -Xmx1024M. Bez rozmýšľania som to priamo zmenil na -Xms512M -Xmx2048M, a výsledkom bolo, že som nemohol vyhradiť dosť miesta pre objektovú haldu. Program sa nemôže postaviť. Až vtedy som si uvedomil, že stále existuje limit pôvodnej maximálnej pamäte. Prehľadal som internet a našiel som mnoho článkov, ktoré sa tejto téme zaoberajú. Nakoniec som našiel najužitočnejší článok na fóre BEA DEV2DEV
Tu moderátor YuLimin vykonal test a dospel k záveru:
Verzia Company JVM Klient s maximálnou pamäťou (mega) Server
NE 1.5.x 1492 1520
SUN 1.5.5(Linux) 2634 2660
SUN 1.4.2 1564 1564
SUN 1.4.2(Linux) 1900 1260
IBM 1.4.2(Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909 1902
Teraz JDK1.6.0_05 používam, testoval som to. Najväčší problém v klientskom stave je, že môj JDK nerozpoznáva parameter -Server a nemôže otestovať stav servera. Odhady sú približne rovnaké.
SUN 1.6.0 1442 N/a
Zdá sa, že v Jave nie je možné použiť veľkú pamäť. A všeobecné príslovie je, že ak je pamäť príliš veľká, čas zberu odpadu bude dlhý. To je tiež pochopiteľné, zvyčajne sa zbiera, keď pamäť nestačí, skenovanie 2G pamäte je samozrejme oveľa pomalšie ako 1G a je viac pamäťových objektov, odhadovaný vzťah exponenciálne rastie.
Nižšie sú priložené testovacie metódy a testovacie záznamy spoločnosti YuLimin.
Testovacia metóda: Použite príkaz java -XmxXXXXM -version na testovanie v príkazovom riadku a potom postupne zvyšujte hodnotu XXXX, ak beží normálne, znamená to, že špecifikovaná veľkosť pamäte je dostupná, inak sa vytlačí chybová správa. |