Neseniai dirbo su "Java" programa. Iš pradžių man visada patiko "Java" atminties valdymas, nereikia jaudintis dėl atminties paskirstymo, tiesiog paskirstykite, šiukšlių surinkėjas atgaus atmintį už jus. Dabar programa sukurta su dideliu duomenų kiekiu, o greičio sumetimais ketinu įkelti visą informaciją į atmintį, kuri užtikrins greitą atsakymą. Aš vis dar pakartotinai skaičiuoju atmintį, galvoju apie savo duomenų kiekį, kurio pradžioje turėtų pakakti (mano mašina turi 4G atmintį, nors "Windows" atpažįsta 3.5G, bet tai turėtų būti gerai, palyginti su dabartiniu duomenų kiekiu).
Netikėtai pirmojo eksperimento programa veikė kelias valandas ir susidūrė su atminties trūkumo išimtimi. Žiūrėdamas į savo VM nustatymus, nustatiau -Xms512M -Xmx1024M. Apie tai negalvodamas, tiesiogiai pakeičiau jį į -Xms512M -Xmx2048M, ir rezultatas buvo toks, kad negalėjau rezervuoti pakankamai vietos objektų krūvai. Programa negali atsikelti. Tik tada supratau, kad vis dar yra pradinės maksimalios atminties riba. Ieškojau internete ir radau daug straipsnių, kuriuose aptariamas šis klausimas. Galiausiai radau naudingiausią straipsnį BEA DEV2DEV forume
Čia moderatorius YuLimin atliko testą ir padarė išvadą:
Įmonės JVM versija Maksimali atmintis (mega) klientas Maksimali atmintis (mega) serveris
SEKMADIENIS 1.5.x 1492 1520
SAULĖ 1.5.5 (Linux) 2634 2660
SEKMADIENIS 1.4.2 1564 1564
SAULĖ 1.4.2 (Linux) 1900 1260
IBM 1.4.2 (Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909 1902
Dabar naudoju JDK1.6.0_05, išbandžiau. Didžiausias dalykas kliento būsenoje yra tai, kad mano JDK neatpažįsta parametro -Server ir negali patikrinti serverio būsenos. Skaičiavimai yra maždaug tokie patys.
SEKMADIENIS 1.6.0 1442 N/a
Atrodo, kad "Java" neįmanoma naudoti didelės atminties. Ir bendras posakis yra tas, kad jei atmintis yra per didelė, šiukšlių surinkimo laikas bus ilgas. Tai taip pat suprantama, paprastai renkama, kai atminties nepakanka, 2G atminties nuskaitymas, žinoma, yra daug lėtesnis nei 1G, o atminties objektų yra daugiau, numatomas ryšys eksponentiškai didėja.
Žemiau pateikiami YuLimin bandymo metodai ir bandymų įrašai.
Bandymo metodas: Norėdami išbandyti komandinę eilutę, naudokite komandą java -XmxXXXXM -version, tada palaipsniui didinkite XXXX vertę, jei ji veikia normaliai, tai reiškia, kad yra nurodytas atminties dydis, priešingu atveju bus išspausdintas klaidos pranešimas. |