Myytinmurskausta: Out of Permgen Space

Törmäsin hienoon artikkeliin koskien Out of Permgen Space ongelmaa jota ainakin Tomcat ja JBOSS palvelinten ylläpitäjät ovat varmasti aika ajoin nähneet 😉

Tieturin Tehokas Java kurssilla yksi keskeisimmistä opeistahan on käydä läpi Java muistimalli, eri alueet, niiden toiminta, eri vaihtoehdot roskankeruualgoritmeille jne. Nyt PermGen Space ei normaalisti kuulukaan roskankeruun piiriin, kuten jo nimikin kertoo. Sinne lataillaan pysyvämmät objektit kuten luokkien määritykset. Servereillä kun tekee pari kertaa hot deploy toiminnon, niin useimmiten ladataan vain lisää tavaraa Permgen alueelle jolloin se ennen pitkää täyttyy. Tässä kohdin noviisi palvelimen hallinnoija pukkaa lisää permgen muistia, joka auttaa hetken..

-XX:MaxPermSize=XXXM

…mutta ei poista ongelmaa. Ennen pitkää muisti loppuu taas, kun tarpeeksi monta kertaa tehdään hot deploy. Tähän jotkut vastaavat buuttaamalla koko palvelimen aika ajoin. Mutta muitakin keinoja löytyy:

-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled

Näistä on kirjoiteltu vähän negatiiviseen sävyyn, koska niiden dokumentaatio on niukkaa. Mutta kokeilemisen arvoista. Nämä yrittävät sallia myös permgen alueen roskankeruun jolloin virtuaalikone voi vapauttaa muistia. jos homma toimii.

PermGen Space on Hotspot virtuaalikoneen ominaisuus, ja siis sen ongelma. JRockitissa ei ole PermGen aluetta, vaan se pistää objektit Heap alueelle. Mikä ei sinällään auta jos joku vuotaa muistia ja luo uusia objekteja alati. Mutta hyvä huomata että eri virtuaalikoneet toimivat eri tavoin.

Jep, eli täydellistä ratkaisua ei ole, mutta on kuitenkin hyvä tarkistaa johtuuko virhe siitä että sovellus todella vaatii enemmän permgen muistialuetta jolloin paras ratkaisu on sitä antaa – vai johtuvatko ongelmat siitä että sovellus ’vuotaa’ permgen muistia eli työntää alueelle lisää ja lisää ja lisää tavaraa, tai uudestaan ja uudestaan ja uudestaan kuten jotkut sovelluspalvelimet tekevät. Huhujen mukaan uusimmassa Tomcat versiossa on yritetty korjailla näitä pulmia, mutta omaa kokemusta asiasta ei ole. Jokainen serveri ja sen versio tuntuu olevan uniikki tapaus jossa on omat uniikit ongelmansa.

Mutta artikkelin juusto siis tässä: Java sovellukset eivät aina hyödy siitä että muistia lisätään, vaikka ne kaatuisivat muistin loppumiseen. Ratkaisu saattaa olla roskankeruun tuunaus, tai ongelman lähteen selvittäminen esim. jollain profiler työkalulla. Etenkin heap muistia lisättäessä voit lykätä roskankeruuta hetken mutta mitäpä sitten kun 64 gigan heap roskankerätään ja defragmentoidaan kerralla? No, siinä kannattaa käyttää G1 algoritmia 😉

 

Ja lähdeartikkeli joka inspiroi pohdiskelun:

http://java.dzone.com/articles/busting-permgen-myths

Mainokset

2 thoughts on “Myytinmurskausta: Out of Permgen Space

  1. Nice article!
    Would be even more cool if you also linked to the blog post that inspired these thoughts 😉

    • Hi, and cheers for reading this through translator! 😉

      I added the source link to end of article.

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