Nedávno pracuji na programu pro Javu. Původně se mi vždycky líbila správa paměti v Javě, nemusíš se starat o alokaci paměti, stačí alokovat, garbage collector ti paměť získá zpět. Program je nyní vyvinut s velkým množstvím dat a kvůli rychlosti načtu všechny informace do paměti, což zajistí rychlou odezvu. Stále opakovaně počítám paměť a přemýšlím o vlastním množství dat, což by mělo na začátku stačit (můj počítač má 4G paměť, i když Windows rozpoznává 3,5G, ale mělo by to být v pořádku ve srovnání s mým současným objemem dat).
Nečekaně program prvního experimentu běžel několik hodin a narazil na výjimku Out of Memory. Když jsem se podíval na nastavení svého stroje, nastavil jsem -Xms512M -Xmx1024M. Bez přemýšlení jsem to přímo změnil na -Xms512M -Xmx2048M, a výsledkem bylo, že jsem nemohl vyhradit dostatek místa pro objektovou haldu. Program se nemůže zvednout. Teprve tehdy jsem si uvědomil, že stále existuje limit na původní maximální paměť. Prohledal jsem internet a našel mnoho článků o tomto problému. Nakonec jsem našel nejužitečnější článek na fóru BEA DEV2DEV
Zde moderátor YuLimin provedl test a dospěl k závěru:
Verze firemního JVM Klient s maximální pamětí (mega) Server
NE 1.5.x 1492 1520
SUN 1.5.5(Linux) 2634 2660
NE 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
Teď JDK1.6.0_05 používám, testoval jsem to. Největší problém ve stavu klienta je, že můj JDK nerozpoznává parametr -Server a nemůže otestovat stav serveru. Odhady jsou zhruba stejné.
NE 1.6.0 1442 N/A
Zdá se, že v Javě není možné používat velkou paměť. A obecně se říká, že pokud je paměť příliš velká, doba sběru odpadu bude dlouhá. To je také pochopitelné, obecně se sbírá tehdy, když paměť nestačí, skenování 2G paměti je samozřejmě mnohem pomalejší než 1G a je více paměťových objektů, odhadovaný vztah exponenciálně roste.
Níže jsou přiloženy testovací metody a záznamy YuLimin.
Testovací metoda: Použijte příkaz java -XmxXXXXM -version k testování v příkazovém řádku a poté postupně zvyšujte hodnotu XXXX, pokud běží normálně, znamená to, že je k dispozici zadaná velikost paměti, jinak se vypíše chybová zpráva. |