# Speicherprobleme



## firestone (2. Mrz 2011)

Hallo zusammen,
weiss zwar nicht ob ich hier richtig bin aber ich bin derzeit etwas ratlos was ich noch tun kann. 
Also folgendes Problem. Ich habe eine Webanwendung mit Struts/Hibernate auf einem Websphere Server 6.1 installiert. Der Websphere selbst ist auf einer AS/400 installiert. 

Ich habe mir von IBM schon den IBM Support Assistant runter geladen mit dem Health Center um den Speicherverbrauch zu überwachen. Wenn wir nun die Anwendung laufen lassen, kann man beobachten das der Speicher rapide schnell nach oben geht und schnell das Limit von 1024 erreicht hat. 

Unsere ersten Vermutungen waren
1. Der Garbage Collector kann nicht aufräumen, weil die Objekte noch mit der Datenbankverbindung referenziert sind
2. Er kann nicht aufräumen, weil die Session noch aktiv ist 

So Punkt 1 hat sich nicht bestätigt selbst wenn man die Datenbankverbindung killt wird nichts aufgeräumt . Zu Punkt 2 habe ich nun in die web.xml folgende Zeilen eingebaut 

```
<session-config>
	<session-timeout>2</session-timeout>
	</session-config>
```

So leider baut der Server immer noch nicht vollständig wieder ab. Also wenn das Anfangslevel des benutzen Heap Speichers bei 300 MB lag, baut er nachher nur bis zu einem Level von 541 MB ab. 

Woran kann das liegen? Habt ihr noch Tools Ideen was ich noch tun könnte um das Problem zu finden ?

LG Fireli


----------



## maki (2. Mrz 2011)

VisualVM sagt dir etwas?
Damit könntest dud ei Anwendung Monitoren, inkl Speicherlecks, GC, Performance, etc. pp.

Läuft denn die WebApp auch auf anderen Servern, wie Tomcat? Dafür gibt es zB. LamdbaProbe.


----------



## firestone (2. Mrz 2011)

VisualVM sagt mir jetzt so nichts. Wie kann ich den dieses Tool auf der AS/400 starten ? 

Derzeit läuft die Anwendung nur auf einem Websphere werden wohl aber wenn wir nicht weiter kommen das ganze auf einem Tomcat versuchen der auf einem Windows 2003 Server (meine ich) läuft


----------



## maki (2. Mrz 2011)

> Wie kann ich den dieses Tool auf der AS/400 starten ?


Würde mal spontan "gar nicht" sagen, aber sicher bin ich da nicht.
Musst ja auch nicht auf dem Prod. System während des Betriebes nach Fehlern suchen


----------



## firestone (2. Mrz 2011)

Nein im Produktivsystem natürlich nich aber wir haben die gleiche Kombination auch als Entwiclungsmaschiene .


----------



## DerEisteeTrinker (4. Mrz 2011)

Die VM gibt einmal benutzten Speicher nicht wieder an das System zurück. Sprich sie braucht einmal 500MB und behält sie bei, auch wenn nur 300MB belegt sind mit Objekten. Schau mal in deinen Objekten nach, ob du iwelche Referenzen unnötig offenhälst oder einige Dinge doppelt lädst. Doppelt geladene Objekte, kannst du vllt in ein Caching packen.


----------



## brauner1990 (4. Mrz 2011)

Wenn du dir SICHER bist, die Objekte werden ab diesem Punkt nicht mehr benötigt, oder es ist im Zweifel besser Sie nachzuladen, dann setze Sie 
	
	
	
	





```
null
```
, dann sammelt der Garbage Sie wieder ein


----------



## firestone (8. Mrz 2011)

Das Problem ist das das testen sehr schwer ist ich habe immer noch nicht die Stelle gefunden an der das Speicherleck entsteht. 

Die Objekte müssen ja an irgendwas noch dran hängen das der Garbage Collector sie nicht aufräumt aber an was ?
Was ich bereits auschließen kann sind
1. Die Sessions ich habe im Websphere und in der Anwendung selbst einen Session Time Out von 2 Minuten definiert gehabt aber es passiert nichts der Speicher bleibt weiterhin belegt
2. Die Datenbankverbindung zur AS/400 ich habe im Hintergrund den Job auf der AS/400 gekillt damit müsste die Verbindung ja weg sein aber der Speicher wurde nicht freigegeben. 

Könnte es sein das die Objekte an einer Hibernate Session hängen ? Und diese wiederum beim Session Time Out nicht mit gekillt wird ? Ich bin echt etwas Ratlos . In der Analyse des Heap Dumps sehe ich das jede Menge HashMaps offen sind aber ich hätte erwartet das wenn die Session abläuft diese Referenzen wieder freigegeben werden oder sehe ich das falsch ? 

Was mich auch wundert ist ich habe ein Level von 100 MB dann installiere ich die Anwendung und arbeite damit der Server pklustert sich auf auf ein Level von z.B 1024 MB dann stoppe ich die Anwendung und spätestens da müsste der Server doch wieder bis zu dem Level von 100 MB aufräumen oder ? Das tut er scheinbar aber auch nicht.

Ich hoffe ihr habt noch tips für mich vielleicht auch welche wie wir den Websphere noch etwas besser analysieren und verstehen können .

LG Fireli


----------



## maki (8. Mrz 2011)

> Was mich auch wundert ist ich habe ein Level von 100 MB dann installiere ich die Anwendung und arbeite damit der Server pklustert sich auf auf ein Level von z.B 1024 MB dann stoppe ich die Anwendung und spätestens da müsste der Server doch wieder bis zu dem Level von 100 MB aufräumen oder ?


k.A. ob du das gemeint hattest, aber die JVM muss gestoppt werden bevor der speichern wieder freigegeben werden kann.


----------



## LoR (8. Mrz 2011)

1) jvisualvm findest du im bin-Ordner deiner JDK-Installation. Ich meine damit müsstest du dich auch remote draufschalten können.

2) Probier mal zusätzlich die folgenden Optionen -XX:MaxHeapFreeRatio=20 -XX:MinHeapFreeRatio=10. Das geht u.U. ein wenig auf die Performance.

3) Das hilft dir jetzt nicht viel weiter, aber ich hatte ähnliche Probleme vor 1,5 - 2 Jahren mit dem Hibernate-Zeug. Mittlerweile bin ich davon abgekommen solche Frameworks zu benutzen. Es wird zwar überall an jeder Ecke von "high-performance, scalable ..."  usw. geredet in der Realität ist das meiner Ansicht nach nicht der Fall. Die Komplexität des Mappings (via XML oder Annotations) wird selbst bei kleinen Applikationen mit nur wenigen Tabellen schnell unübersichtlich und extrem teuer aufgrund vieler referenzierter Objekte.


----------



## firestone (9. Mrz 2011)

@maki
ich dachte wenn ich die Anwendung stoppe müssten doch Objekte die mit der Anwendung zu tun haben und Session etc aufgeräumt werden oder nicht ? 

Können trotz das die Anwendung gestoppt ist noch Sachen von ihr "offen" sein das der GC sie nicht aufräumen kann ?


----------



## firestone (9. Mrz 2011)

Derzeit läuft unsere Anwendung ja auf einem Websphere Server 6.1 der wiederrum auf einer AS/400 installiert ist. Meint ihr es wäre "besser" oder "einfacher" das Problem zu finden wenn wir die Anwendung mal auf einem Tomcat auf einem Windows System laufen lassen ?

Hat man dort bessere Analyse Möglichkeiten ?  ich bin etwas ratlos wo ich anfangen soll zu suchen


----------



## maki (9. Mrz 2011)

firestone hat gesagt.:


> @maki
> ich dachte wenn ich die Anwendung stoppe müssten doch Objekte die mit der Anwendung zu tun haben und Session etc aufgeräumt werden oder nicht ?


Ja, aber deswegen gibt die VM keinen Speicher an das OS zurück, das passiert erst, wenn die VM beendet wird.



> Können trotz das die Anwendung gestoppt ist noch Sachen von ihr "offen" sein das der GC sie nicht aufräumen kann ?


Ja, könnte sein, aber ohne ein Tool wie VisualVM ist das alles nur Spekulation.


----------

