Olen äskettäin työskennellyt Java-ohjelman parissa. Alun perin olen aina pitänyt Javan muistinhallinnasta, ei tarvitse huolehtia muistin jakamisesta, vain varaa se, roskien kerääjä ottaa muistin takaisin puolestasi. Nyt ohjelma on kehitetty suurella datamäärällä, ja nopeuden vuoksi lataan kaiken tiedon muistiin, mikä varmistaa nopean vasteen. Lasken edelleen muistia toistuvasti, mietin omaa datamäärääni, joka pitäisi riittää alussa (koneessani on 4G-muisti, vaikka Windows tunnistaa 3,5G:n, mutta sen pitäisi olla kunnossa nykyiseen datamäärääni verrattuna).
Yllättäen ensimmäisen kokeen ohjelma käynnistyi muutaman tunnin ja kohtasi Muistin Ulkopuolisen poikkeuksen. Katsoessani omia virtuaalikoneen asetuksiani asetin -Xms512M -Xmx1024M. Ilman ajatusta muutin sen suoraan muotoon -Xms512M -Xmx2048M, ja lopputuloksena en pystynyt varaamaan tarpeeksi tilaa objektikasalle. Ohjelma ei pääse ylös. Vasta silloin tajusin, että alkuperäisellä maksimimuistilla oli vielä raja. Etsin internetistä ja löysin monia artikkeleita, joissa käsiteltiin tätä aihetta. Lopuksi löysin hyödyllisimmän artikkelin BEA:n DEV2DEV-foorumilta
Tässä moderaattori YuLimin teki testin ja päätyi johtopäätökseen:
Yrityksen JVM-versio Maksimimuisti (mega) asiakas Maksimimuisti (mega) palvelin
SUN 1.5.x 1492 1520
SUN 1.5.5 (Linux) 2634 2660
SU 1.4.2 1564 1564
SUN 1.4.2 (Linux) 1900 1260
IBM 1.4.2(Linux) 2047 ei saatavilla
BEA JRockit 1.5 (U3) 1909 1902
Käytän JDK1.6.0_05 nyt, testasin sitä. Suurin ongelma asiakastilassa on, että JDK:ni ei tunnista -Server-parametria eikä pysty testaamaan palvelimen tilaa. Arviot ovat suunnilleen samat.
SU 1.6.0 1442 Ei saatavilla
Näyttää siltä, että Javassa on mahdotonta käyttää suurta muistia. Yleinen sanonta on, että jos muisti on liian suuri, roskien keräysaika on pitkä. Tämä on myös ymmärrettävää, yleensä kerätään, kun muisti ei riitä, 2G-muistin skannaus on tietenkin paljon hitaampaa kuin 1G:n, ja muistiobjekteja on enemmän, arvioitu suhde kasvaa eksponentiaalisesti.
Alla on liitteenä YuLiminin testimenetelmät ja testitiedot.
Testimenetelmä: Käytä java -XmxXXXXM -version -komentoa testataksesi komentorivillä ja nosta sitten XXXX:n arvoa vähitellen, jos se toimii normaalisti, se tarkoittaa, että määritelty muistikoko on käytettävissä, muuten virheilmoitus tulostuu. |