V Apache Tomcatu se můžete setkat po opakovaném deploy/undeploy s touto výjimkou. Tomcat totiž, podobně jako jiné J2EE kontejnery, spoléhá v uklízení paměti po nepotřebných class souborech na JRE. Sunovská implementace úklid implicitně neprovádí, proto se dříve nebo později paměť zaplní. Bránit se tomu dá nastavením parametru pro JRE – v Tomcatu to provedeme nastavením proměnné CATALINA_OPTS:
CATALINA_OPTS="-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
Se stejnou chybou se můžeme také setkat, když se snažíme o deploy příliš velikého projektu (class soubory v paměti zaberou více jak 64 MB). V tomto případě je nutné ještě zvýšit limit paměti pro bytekód JRE, která je standardně 64 MB (Sun JRE 1.6.0):
CATALINA_OPTS="-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:MaxPermSize=128m"
Pozor! Toto bude fungovat až od verze JRE/JDK 1.6/6.0. V případě starší verze nečekejte chybovou hlášku nebo nějaké varování – přepínače budou zkrátka ignorovány a výjimku můžete čekat velmi brzy.
Jiným řešením může být nasazení JRE JRockit 1.6.0, které netrpí těmito problémy.
Diskuze