# Tomcat PermGen



## MQue (5. Sep 2009)

Hallo,

ich verwende den Tomcat- Server auf einem Ubuntu- Rechner und bekomme bei jedem mal starten des Tomcat Servers die Fehlermeldung unten. Ich hab gegoogelt und gelesen, dass ich irgendwie die Speichergröße erhöhen muss, könnte mir jemand sagen, wo genau (in welcher Datei) ich da was eintragen muss, damit ich diese Fehlermeldung ausschalten kann.
Vielen Dank,
lg



```
05.09.2009 05:48:35 org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet jsp threw exception
java.lang.OutOfMemoryError: PermGen space
```


----------



## maki (5. Sep 2009)

Seltsam, starten sollte de TC eigentlich in der Standardkonfig ohne Probleme.

Umgebugsvariablen etc. trägt man am besten in der setenv.(bat|sh) ein, oder in die Umgebungsvariable CATALINA_OPTS, oder man ändert die catalina.(bat|sh).


----------



## MQue (5. Sep 2009)

maki hat gesagt.:


> Seltsam, starten sollte de TC eigentlich in der Standardkonfig ohne Probleme.
> 
> Umgebugsvariablen etc. trägt man am besten in der setenv.(bat|sh) ein, oder in die Umgebungsvariable CATALINA_OPTS, oder man ändert die catalina.(bat|sh).



Und was schreibe ich da genau hinein?

PS: hab jetzt den TC neu instaliert, dann ist es ca. 10 zu deployen gegangen und jetzt hab ich wieder das gleiche Problem.

lg
Michl


----------



## maki (5. Sep 2009)

> Und was schreibe ich da genau hinein?


Eben die Paramter für den höheren PermGen, [c]-XX:MaxPermSize[/c].



> PS: hab jetzt den TC neu instaliert, dann ist es ca. 10 zu deployen gegangen und jetzt hab ich wieder das gleiche Problem.


Was heisst den 


> dann ist es ca. 10 zu deployen gegangen


Meinst du dass der Fehler auftritt wenn die WebApp öfters deployed wird?
Ein Fehler in deiner Anwendung oder im Tomcat können dazu führen.
Würde da mal nachsehen welche Klassen den PermGen verstopfen.


----------



## MQue (5. Sep 2009)

Ich befürchte ich habe in meiner Applikation irgendwo einen memory leak (wahrscheinlich beim Datenbankinitialisieren/Zugriff mit Hibernate).

Was ich allerdings überhaupt nicht verstehe ist, das ich in der NetBeans IDE alle Projekte geschlossen habe, den Ordner webapps von Tomcat völlig gelöscht habe und trotzdem unteren Stacktrace mit meinen Klassen bekomme. Wo kommen die her, gibts da von Tomcat noch eine Referenz auf meine Projekte oder wie ist das möglich?

lg


```
java.lang.OutOfMemoryError: PermGen space
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1850)
        at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:890)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1354)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1850)
        at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:890)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1354)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
        at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:267)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
        at net.hibernate.InitSessionFactory.<clinit>(InitSessionFactory.java:26)  // ab hier meine Klassen
        at net..hibernate.BasicManager.getSession(BasicManager.java:28)
        at net.hibernate.EventManager.listBlogtext(EventManager.java:29)
        at net.hibernate.DatabaseInterface.getAllBlogtext(DatabaseInterface.java:45)  // bis hier
        at org.apache.jsp.jsp.index_jsp._jspService(index_jsp.java:82)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
```


----------



## maki (5. Sep 2009)

Die sog. Permanent Generation hält alle langlebigen Objekte, so langelebig dass die Sun JVM sie nie wieder abräumt AFAIK. Dazu gehören zum Beispiel Klassenobjekte ansich (Class), die mal vom Classloader geladen wurden, irgendwann ist die PermGen dicht, ist zB. ein Problem für die meisten Server die lange laufen und wo Anwendungen ge-updatet werden.

In dieses Thema solltest du dich mal reinlesen, ist wichtig 

Keine Ahnung was Netbeans da macht, das Problem sollte aber verschwinden wenn der Tomcat Server neugestartet wird.

Kann mich gerade nicht erinnern, mit welchen Speichereinstellungen der TC in der Standardkonfig anläuft, wenn es wirklich die üblichen 64 MiB sind, erklärt das einiges, das reicht auf keinen Fall.
Noch ein Wort zu Ubuntu und Tomcat, ich hoffe du "installierst" nciht über apt-get/aptitude, am besten das TC Archiv runterladen, entpacken  und nutzen, die Version in den Repos ist imho verhunzt.


----------



## MQue (6. Sep 2009)

maki hat gesagt.:


> Die sog. Permanent Generation hält alle langlebigen Objekte, so langelebig dass die Sun JVM sie nie wieder abräumt AFAIK. Dazu gehören zum Beispiel Klassenobjekte ansich (Class), die mal vom Classloader geladen wurden, irgendwann ist die PermGen dicht, ist zB. ein Problem für die meisten Server die lange laufen und wo Anwendungen ge-updatet werden.
> 
> In dieses Thema solltest du dich mal reinlesen, ist wichtig
> 
> ...



ich hab mir diese 2 Blogs mal durchgelesen, da wurde mir klar das der Fehler auch bei mir liegen könnte  Frank Kieviet : Weblog

Ich war auch der Meinung, dass die Fehlermeldung weg ist, wenn ich den Tomcat neu starte aber dem war nicht so, das irritiert mich ein bisschen, 

Ich habe jetzt Netbeans neu installiert (eine Version höher), jetzt bekomme ich diese Fehlermeldung mal nicht (hab aber auch noch nicht deployed - da mit dieser höheren Version von NetBeans meine Projekte nicht mehr funktionieren - , nur mal gestartet)

Ich verwende in meinem Projekt Hibernate, vielleicht liegt da der Fehler in meiner Implementierung (im der Mitte des Stacktrace waren ein paar Klassen von meiner Hibernate- Implementierung angeführt), 
Ich werde es jetzt so machen, wie du vorgeschlagen hast -> mit Spring und Hibernate - ohne InitSessionFactory, auch werd ich Struts einbauen, oder sollte ich statt Struts JSF verwenden (Kenn mich mit beiden noch nicht so richtig aus, weiß nur, dass Struts das MVC nachbildet und deklarativ einiges gemacht werden kann).

Auch bin ich mir nicht sicher ob ich Hibernate noch verwenden soll, da es ja in diese Richtung was neues gibt, hab ich hier in diesem Forum gelesen (mir fällt der Name jetzt gerade nicht ein).

Könntet Ihr mir vielleicht in diese Richtung ein paar Tips geben.

Vielen Dank,
lg


----------



## maki (6. Sep 2009)

Bekommst du den Fehler in Netbeans?
Dann solltest du den Speicher von Netbeans erhöhen, inkl. PermGen Space, da Netbeans mit einer minimal Speicher Konfig kommt die imho nie ausreicht sobald JEE im Spiel ist, dazu die Datei [c]/etc/netbeans.conf[/c] abändern.

Ob du Struts oder JSF einsetzen willst, oder Wicket oder oder oder... die Entscheidung kann ich dir nicht abnehmen, struts jedoch scheint definitiv auf dem absteigenden Ast zu sein...

Alternative zu Hibernate? Du meinst wohl EclipseLink, anders als Hibernate werden hier keine Proxies verwendet, macht die Sache einfacher imho.


----------

