Hiljuti töötasin Java programmi kallal. Alguses on mulle alati meeldinud Java mäluhaldus, pole vaja muretseda mälu jaotamise pärast, lihtsalt eralda, prügikoristaja võtab mälu sulle tagasi. Nüüd on programm arendatud suure andmemahuga ja kiiruse huvides laen kogu info mällu, mis tagab kiire vastuse. Loen endiselt mälu korduvalt, mõeldes oma andmemahtudele, mis peaks alguses piisama (minu arvutil on 4G mälu, kuigi Windows tunneb ära 3,5G, kuid see peaks olema korras võrreldes praeguse andmemahuga).
Üllatuslikult jooksis esimese eksperimendi programm paar tundi ja sattus mälestuse kadumise erandile. Vaadates oma virtuaalmasina seadeid, määrasin -Xms512M -Xmx1024M. Ilma sellele mõtlemata muutsin selle otse -Xms512M -Xmx2048M-ks ja tulemuseks oli, et ma ei suutnud piisavalt ruumi objektide kuhja jaoks reserveerida. Programm ei saa püsti. Alles siis sain aru, et algsel maksimaalsel mälul on endiselt piirang. Otsisin internetist ja leidsin palju artikleid, mis käsitlesid seda teemat. Lõpuks leidsin BEA DEV2DEV foorumist kõige kasulikuma artikli
Siin tegi moderaator YuLimin testi ja jõudis järeldusele:
Ettevõtte JVM versioon Maksimaalne mälu (mega) klient Maksimaalne mälu (mega) server
SUN 1.5.x 1492 1520
SUN 1.5.5 (Linux) 2634 2660
PÜHAPÄEV 1.4.2 1564 1564
SUN 1.4.2 (Linux) 1900 1260
IBM 1.4.2(Linux) 2047 puudub
BEA JRockit 1.5 (U3) 1909 1902
Kasutan JDK1.6.0_05 praegu, testisin. Suurim probleem kliendi olekus on see, et minu JDK ei tunne ära -Server parameetrit ega saa serveri olekut testida. Hinnangud on umbes samad.
SUN 1.6.0 1442 N/a
Tundub, et Javas on võimatu kasutada suurt mälu. Ja üldine ütlus on, et kui mälu on liiga suur, on prügi koristamise aeg pikk. See on samuti mõistetav, tavaliselt kogutakse see siis, kui mälust ei piisa, 2G mälu skaneerimine on muidugi palju aeglasem kui 1G mälu ja mäluobjekte on rohkem, hinnanguline seos kasvab eksponentsiaalselt.
Allpool on lisatud YuLimini testimeetodid ja testikirjed.
Testimeetod: Kasuta käsurea testimiseks java -XmxXXXXM -version käsku ja seejärel suurenda XXXX väärtust järk-järgult; kui see töötab normaalselt, tähendab see, et määratud mälu suurus on saadaval, vastasel juhul prinditakse veateade. |