Nedavno delam na programu za Javo. Sprva mi je bilo vedno všeč upravljanje pomnilnika v Javi, ni treba skrbeti za dodeljevanje pomnilnika, samo dodelji, zbiralnik smeti bo pomnilnik povrnil namesto tebe. Program je zdaj razvit z veliko količino podatkov, in zaradi hitrosti bom vse informacije naložil v pomnilnik, kar bo zagotovilo hiter odziv. Še vedno večkrat štejem pomnilnik in razmišljam o svoji količini podatkov, kar bi moralo na začetku zadostovati (moj računalnik ima 4G pomnilnik, čeprav Windows prepozna 3,5G, a bi moralo biti v redu glede na trenutni podatkovni volumen).
Nepričakovano je program prvega eksperimenta trajal nekaj ur in naletel na izjemo Izven spomina. Glede na nastavitve svojega VM-ja sem nastavil -Xms512M -Xmx1024M. Brez razmišljanja sem ga neposredno spremenil v -Xms512M -Xmx2048M, rezultat pa je bil, da nisem mogel rezervirati dovolj prostora za kup objektov. Program ne more vstati. Šele takrat sem ugotovil, da obstaja omejitev prvotnega največjega pomnilnika. Preiskal sem internet in našel veliko člankov, ki obravnavajo to temo. Končno sem našel najbolj uporaben članek na BEA-jevem forumu DEV2DEV
Tukaj je moderator YuLimin opravil test in prišel do zaključka:
Različica podjetja JVM Največji pomnilnik (mega) odjemalec Največja pomnilniška (mega) strežnik
SUN 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
Zdaj uporabljam JDK1.6.0_05, testiral sem. Največja težava v odjemalskem stanju je, da moj JDK ne prepozna parametra -Server in ne more testirati stanja strežnika. Ocene so približno enake.
SUN 1.6.0 1442 N/a
Zdi se, da je v Javi nemogoče uporabljati velik pomnilnik. In splošno pravilo pravi, da če je pomnilnik prevelik, bo čas zbiranja smeti dolg. To je tudi razumljivo, običajno se zbira, ko pomnilnik ni dovolj, skeniranje 2G pomnilnika je seveda veliko počasnejše kot 1G, in je več pomnilniških objektov, ocenjena povezava eksponentno narašča.
Spodaj so priložene testne metode in testni zapisi YuLimina.
Metoda testiranja: Uporabite ukaz java -XmxXXXXM -version za testiranje v ukazni vrstici, nato pa postopoma povečujte vrednost XXXX; če deluje normalno, to pomeni, da je na voljo določena velikost pomnilnika, sicer bo natisnjeno sporočilo o napaki. |