Java 8 ja out of out of PermGen space errors ;)

Java 8, joka siis julkaistaan vasta ensi vuoden puolella, tulee sisältämään taas hurjasti uutta tavaraa samaan tapaan kuin Java 5 aikoinaan. Bloggailen muista päivityksistä aikanaan lisää, ja Lambdoista olen jo kirjoitellutkin – tarkoitus olisi meilläkin alkaa kouluttamaan niitä jo päivitetystä peruskurssista lähtien – mutta tällä kertaa ajattelin kirjailla pari ajatusta muistinkäsittelystä.

Java järjestelmiä ja etenkin servereitä ylläpitäneet ovat todennäköisesti nähneet muutaman kerran ilmoituksen out of PermGen space – kun serveri kaatuu muistinpuutteen vuoksi. Esim. monissa open source servereissä tämä ilmenee kun tehdään toistuvasti päivityksiä ja asennetaan sovelluspaketeita ilman että serveriä käynnistetään välillä. Tämä johtuu siitä että perinteisesti aina Java 1.0:sta Java 7:ään asti Java virtuaalikoneessa on ollut oma rajattu PermGen muistialueensa joka ei kasva, ei ole osa heap muistia, ja jota ei automaattinen roskankeruu prosessoi. Tänne on talletettu mm. staattiset osat ja luokkien rakenteet, ja koska roskankeruu ei sitä putsaile, kun tila loppuu, virtuaalikone – ja serveri – kaatuvat. Tähän on voitu reagoida aikanaan parilla tavalla: säädetään käynnistysparametreilla suuri PermGen alue, ja/tai buuttaillaan serveriä päivitysten yhteydessä. Tai hankitaan alusta joka hoitaa homman, esim. JRebel. Tai serveri joka osaa sisäisesti hallita tämän ’classloader leak’ ongelman.

Chuck Norris ei pelkää muistivuotoja. Muistivuodot pelkäävät Chuck Norrisia.

Java 8 tulee poistamaan kokonaan PermGen alueen. Sen tilalle tulee uusi MetaSpace, joka on automaattisen roskankeruun piirissä, ja joka myös kasvaa ja kutistuu automaattisesti.  MetaSpace on osa ’native’ muistia, ei siis osa varattua heap muistia. Sitä voi säätää MetaspaceSize ja MaxMetaspaceSize kytkimillä virtuaalikoneesta.  Jos MaxMetaspaceSize asetetaan, se rajoittaa tilan maksimikokoa, eli järjestelmä voi taas kaatua tilan puutteeseen.  Jos sitä ei aseteta, muisti jatkaa kasvamistaan rajatta, ja tietysti kaatuu ennen pitkää myös. Muutos ei siis poista tarvetta selvittää mikä syö permgen/metaspace tilaa ajan myötä, ja ratkaista näitä ongelmia.

Uusi piirre ei siis poista bugeja, ja virtuaalikoneet voivat edelleen kaatua muistin puutteeseen jos muistia varataan koko ajan lisää. Yksi hyöty muutoksesta kuitenkin on: Muistin varaus on dynaaminen tarpeen mukaan, eli ei tarvitse esim. turhaan varata gigatavua PermGen alueelle, vaan se kasvaa tilanteen ja tarpeen mukaan. Sen säätäminen juuri oikeaksi ei ole siis niin tärkeää.

Mainokset

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s