# Permgen space Tomcat



## trudi (24. Mai 2012)

Hi, 

Ich muss mehrere Projekte gleichzeitig im webapps Ordner haben, allerdings bekam ich immer den Fehler OutOfMemory PermGen Space.
Jetzt habe ich im Internet gefunden, dass man diesen Speicher hochsetzen kann. 
Das habe ich wie folgt getan:

in catalina.sh habe ich folgendes rein kopiert:


```
JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=256m"
```

Allerdings änder das nichts, ich bekomme immernoch an der selben Stelle den Fehler.

Hab ich was falsch gemacht? Oder hängt der PermGen Space überhaupt nicht so mit den
Projekten im webapps Ordner zusammen?


----------



## brauner1990 (24. Mai 2012)

Grundsätzlich hängt das natürlich zusammen, weil ohne webapps kein speicherverbrauch ;-)

Normalerweise geht dem PermGenSpace eine Fehlermeldung vorraus, zusätzlich könntest du aber auch JMX enablen und die Maschine via VisualVm o.ä. Monitoren und DumpOnHeapSpace oder so ähnlich aktiveren.

Die Frage die sich stellt, wieso bekommt er den PermGenSpace ... liegt es an fehlerhafter / schlechter Programmierung oder an einer schier riesigen Masse an webapps, daher die Frage wie viele laufen denn auf dem tomcat?


----------



## nillehammer (24. Mai 2012)

> Hab ich was falsch gemacht? Oder hängt der PermGen Space überhaupt nicht so mit den
> Projekten im webapps Ordner zusammen?


Kann schon sein. Ich selbst habe solche Fehler mit einer älteren Hibernate-Version bekommen, nachdem ich ein paar mal Webapps redeployt, bzw. im Manager Start/Stop oder Reload geklickt habe. Da hat nur ein Restart des Tomcat geholfen. Hibernate und Tomcat haben sich die Schuld gegenseitig zugeschoben. Ein Update von Hibernate hat den Fehler dann beseitigt.


----------



## trudi (24. Mai 2012)

> daher die Frage wie viele laufen denn auf dem tomcat?



6 Projekte mit jeweils 20-30 mb.
3 Stück gehen (webapps hat dann bisschen über 80mb). Sobald aber ein 4. dazu kommt bekomm ich eben den Fehler


```
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
	at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)
	at java.util.concurrent.FutureTask.get(FutureTask.java:111)
	at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:751)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:471)
	at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1453)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:295)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
	at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1381)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1539)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1549)
	at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1528)
	at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.OutOfMemoryError: PermGen space
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2836)
	at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1160)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1668)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
	at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2011)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1974)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1863)
	at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1831)
	at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1817)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1218)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:825)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:300)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5161)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:897)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:873)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:958)
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1599)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.uti
```



> älteren Hibernate-Version



das ist ein älteres Projekt. Weiß nicht welche Hibernate Version benutzt wird. Es ist mal die
hibernate2.jar drin.
Hab jetzt mal die Version 4.1.3 runtergeladen und die hibernate-core-4.1.3-final.jar eingebunden. Der Fehler kommt allerdings torzdem noch


----------



## FArt (25. Mai 2012)

Permgen geht dir aus, wenn sehr viele Klassen geladen werden müssen. Somit ist es nicht unnormal, wenn (abhängig von der Größe der Applikationen) nach einer bestimmten Anzahl von Applikationen der Speicher dort knapp wird.
Wenn die Applikationen bzlg. Classloading voneinander isoliert arbeiten, werden auch noch u.U. die gleichen Klassen mehrfach geladen, nämlich für jede getrennte Applikation.

Lösung: mehr Speicher, in dem Fall Permgen.


----------



## maki (25. Mai 2012)

Um Environment Variablen zu setzen, sollte man bei Tomcat eine Datei namens $CATALINA_HOME/bin/setenv.(sh|bat je nach system)  erstellen und dort die Variablen setzen.


----------



## trudi (25. Mai 2012)

> eine Datei namens $CATALINA_HOME/bin/setenv.(sh|bat je nach system) erstellen



also ich hab jetzt einfach eine Textdatei setenv mit dem Inhalt:


```
JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=256m"
```

erstellt und dann anstatt .txt halt .sh und .bat umbenannt und in den $CATALINA_HOME/bin Ordner gelegt.

Ändert aber nichts, der Fehler kommt immernoch an gleicher Stelle


----------



## FArt (29. Mai 2012)

Ich vermute, dass der Speicher der PermGen nicht ausreicht. Belegen kann man das nur, wenn man sich mal einen Heapdump ansieht bzw. wenn man die VM mal z.B. mit JVisualVM oder anderen geeigneten Tools monitort.


----------

