Servlet - out of memory

Status
Nicht offen für weitere Antworten.
W

waynel

Gast
Hallo Welt !!!
Ich mach mir gerade mal ne kleine Webanwendung mit Tomcat.
Mein Problem ist, daß nach ca. 100 Aufrufen nur noch "out of memory"-Meldung im Browser kommt, und jstat -gcpermcapacity sagt mir, daß >80MB verbraten sind (PGC~PGCMX)

Die Seiten werden aus einer DB generiert.Ich vermute zwar, daß der Fehler nicht in verwaisten Connections liegt, aber trotzdem mal ein Beispiel:

Code:
private void someOutput(){
  PrintWriter out = getWriter();
  Statement SQL = null;
  ResultSet res = null;
  Connection con = null;
  try
   {
     Class.forName("com.mysql.jdbc.Driver");
   }
   catch (Exception e)
   {
     out.println(" Database-error : "+e.toString()+"");
   }
   try
   {
     String query = -die Abfrage eben -
     con = DriverManager.getConnection("jdbc:mysql:-path-?user=-username-&password=-passwort-");
     SQL = con.createStatement();
     res = SQL.executeQuery(query);
     res.first();
     out.println(res.getString();
   }catch(Exception e){out.println(e.toString());}
   finally{
      try { if (res != null) res.close(); } catch(Exception e){}
      try { if (SQL != null) SQL.close(); } catch(Exception e){}
      try { if (con != null) con.close(); } catch(Exception e){}
    }
}

Wenn hier was falsch ist, lasse ich mich gern belehren.

Der grobe Aufbau der Seite ist wie folgt:

Code:
public class mainPage extends HttpServlet{
  // Globale Variablen
  PrintWriter gwriter;
  public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{
    PrintWriter out=res.getWriter();
    res.setContentType("text/html");
    setWriter(out);
    header();
    page();
    footer();
    out.close();
    this.destroy();
  }

   private void setWriter(PrintWriter out){
    gwriter = out;
  }

  private PrintWriter getWriter(){
    return gwriter;
  }
}

header, page, footer entsprechen vom Aufbau her o.g. someOutput.
Zusätzlich nutze ich noch eine Hand voll Variablen für Zähler (int), Strings, und zwei Arrays (String[10]).
Muß ich diese am Ende explizit "closen", "freen","destroyen" oder sonstwas?
Wieviele PrintWriter werden von der VM erzeugt ?
Sind am Ende alle wieder geschlossen und aus dem Speicher entfernt ?

Ich bin über jede Hilfe dankbar.

Habe den gleichen Text schon im Forum von java.de gehabt, leider ohne Erfolg :-(

Und nochwas : wie kann man vermeiden, SQL. con und res mit "null" zu initialisieren ?
Irgendwie finde ich das unschön.
 
W

waynel

Gast
Kann das bitte jemand in den Enterprise JAVA Bereich verschieben ?
 
S

SlaterB

Gast
modifiziere dein Programm ein wenig, ist die Belastung weg, wenn die DB-Anfrage wegfällt?
wie ist es wenn du die Anfrage stellst aber das ResultSet nicht ausgibts,
wie ist es bei Anfragen mit weniger Ergebnissen
usw.
 

ms

Top Contributor
Was genau macht denn this.destroy()?

Instanzvariablen in einem Servlet sollten mit Vorsicht (am besten gar nicht) verwendet werden. Ich fürchte, dass da dein Fehler liegt.
Übergebe den Printwriter als Methodenparameter, anstatt ihn im Servlet zu deklarieren.

Am besten zeigst du mal den ganze Code.

ms
 
W

waynel

Gast
Danke erstmal.

Ich kann mal versuchen, den Code soweit einzudampfen, das er normal postbar wird.
Einen neuen Verdächtigen habe ich auch schon: Die Session.
Ohne die hab ich den Fehler noch nicht provozieren können, trotz aller DB-Anfragen und Ausgaben.
Eine sehr ähnliche Anwendung ohne Sessions läuft seit 14 Monaten in einer 64MB VM ohne Neustart.
Habe ich im ersten Post nicht mit angegeben, aber die Wertübergabe erfolgt über Sessionattribute.
Klappt auch ganz wunderbar, aber kann es sein, daß durch das this.destroy() bei jedem neuen Aufruf,
eine neue kopie der bestehenden Session angelegt wird ?
Der Tomcat-Manager zeigt üner eine Sitzung nur eine Session an, die nach session.invalidate() auch weg ist.
Ich probier mal this.destroy() rauszunehmen.
 
S

SlaterB

Gast
du solltest die Session nicht unbedingt destoryen oder ähnlich komisches,
die Session wird sicherlich irgendwo intern in Frameworks referenziert und kann ruhig automatisch entfernt werden,
vielleicht reagiert auch jemand gereizt, wenn die Session kaputt ist

wenn die Session x MB Daten enthält, dann entferne einfach die Daten aus der Session,
for (all key) {
// remove key oder als schlechte Alternative put (key, null)
}
fertig, ohne irgendwas zu demolieren,
 
W

waynel

Gast
Ich habe das Problem, den stetigen Anstieg der PermCapacity, reproduzieren können.
Um es etwas spannender zu machen, erstmal mein Vorgehen:

EXKURS

Ich habe den Quelltext so geändert, daß die Session-Id angezeigt wird, und in einem zweiten Fenster
jstat -gcpermcapacity -h10 18819 10000 laufen lassen.
Da schon PGC>PGCMN war, habe ich jede Änderung von PGC sofort gesehen.
Dann mir zwei Browser auf die App losgegangen. Login, Logout, Session-Timeout, DB-Aktionen volles Programm.
-> nicht die geringste Änderung.
Die App im Tomcat-Manager neu geladen (wiederholt) und die Seite bebrowst.
-> keine änderung, nichtmal die Session-Ids haben sich geändert.

Dann : neu kompiliert, neu geladen und ... PGC stieg an, andere Session-Id.

EXKURS Ende

Meine Interpretation :

Ich glaube/hoffe, daß der Tomcat nach dem Compile/Restart die App samt Session einfach vergißt.
So kann der Tomcat die Session auch nicht mehr timeouten. Die VM schiebt die Session in den Müll, denn um das Aufräumen kümmert sich ja der Servlet-Container. Sonst hätte die VM die Session ja beim beenden der App auch die Session beendet, oder ?
Der Zuwachs von PGC war abhängig von der beim Reload geladenen Seite (400kb - 3,5 MB), bis zum Tilt.
Ein SessionEventListener hätte da auch nichts genützt, da ja kein Event signalisiert wird, der maxInactivityTimeout greift auch nicht mehr, da die VM keine Session mehr sieht.
Aber irgendwas muß noch auf diesen Datenmüll verweisen, da der GC nicht greift.

Sollte ich komplett daneben liegen, oder das reiner Zufall gewesen sein, oder sonstwas, immer her mit den Kommentaren.
Ich sehe das Problem vorerst als gelöst an, und kann mich jetzt mit den vollen 10% meines geistigen Potentials wieder an die Programmierung machen.

Übrigens : this.destroy() ist raus und der PrintWriter wird als Aufrufparameter übergeben. Vielleicht mache ich das mit der Session auch. (Ein Programm mit globalen Variablen ist ein falsches Programm - Aussage eines Pascal-Programmierers)

Wie kann ich die Initialisierung mit NULL vermeiden ? Da ich selbst aus der Pascal-Ecke komme, sieht das für mich immer falsch aus. da läßt man eine Variable uninitialisiert, aber initialisiert nicht mit "nichts".

Wenn das Problem nicht mehr auftritt, mache ich ein Häkchen bei SOLVED, sobald ich es gefunden habe.

Nochmals Dank an alle.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H What is the Life Cycle of an Object Created Within/Outside of a Servlet? Will that item be destroyed after the session ends? Java Basics - Anfänger-Themen 1
J MySQL Datumsabfrage über ResultSet in Java-Servlet Java Basics - Anfänger-Themen 4
J javax.servlet.ServletException: Name is null Java Basics - Anfänger-Themen 7
G Servlet - externe HTML (URL) auslesen Java Basics - Anfänger-Themen 1
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
E Pdf-Document lässt sich im Servlet nicht öffnen Java Basics - Anfänger-Themen 5
E Erste Schritte Java Webeintwicklung (JSP/Servlet), wie am Besten einsteigen? Java Basics - Anfänger-Themen 0
S Java Servlet - Suche Java Basics - Anfänger-Themen 1
R Upload Servlet: Ausgabe nicht korrekt Java Basics - Anfänger-Themen 2
H Variablen Servlet. Int i global Java Basics - Anfänger-Themen 4
C Inputreader Servlet Nullpointerexception Java Basics - Anfänger-Themen 6
B Servlet und Eclipse Java Basics - Anfänger-Themen 2
B Servlet ausfuehren Java Basics - Anfänger-Themen 4
O Servlet Klassen ? Java Basics - Anfänger-Themen 7
B Datenzugrifft: Servlet -> Objekte Java Basics - Anfänger-Themen 4
T Servlet - oder doch nicht? Java Basics - Anfänger-Themen 4
T Servlet HTML-Formular Java Basics - Anfänger-Themen 9
F Aus Servlet in JSP schreiben Java Basics - Anfänger-Themen 2
T Servlet wird nicht erkannt Java Basics - Anfänger-Themen 10
X Kurve im Servlet zeichnen lassen Java Basics - Anfänger-Themen 4
P Problem mit Servlet Java Basics - Anfänger-Themen 9
D Periodische Aufgaben erledigen in Webanwendung (Servlet/JSP) Java Basics - Anfänger-Themen 7
I Probleme mit Tomcat / Servlet auf Linux (Debian) Java Basics - Anfänger-Themen 7
Tandibur [erledigt] jsp überträgt nicht alle Parameter an Servlet Java Basics - Anfänger-Themen 2
D Servlet kann nicht auf Instanz zugreifen Java Basics - Anfänger-Themen 10
D Servlet mit Utilities Java Basics - Anfänger-Themen 14
J Servlet Interface javax.servlet.Servlet Java Basics - Anfänger-Themen 2
G Parameter in Servlet weiterleiten Java Basics - Anfänger-Themen 5
A Finde javax.servlet.* nicht Java Basics - Anfänger-Themen 6
G JSP, Applet oder Servlet? Java Basics - Anfänger-Themen 8
0x7F800000 Servlet ruft Servlet auf: Wie ServletRequest erstellen? Java Basics - Anfänger-Themen 6
0x7F800000 Servlet: wo bekommt man die eigene adresse? Java Basics - Anfänger-Themen 6
O Weiterleitung in einem Java-Servlet Java Basics - Anfänger-Themen 5
O Jar-Archiv im Servlet verwenden Java Basics - Anfänger-Themen 3
G Servlet Package wo herunterladen? Java Basics - Anfänger-Themen 2
G doGet und doPost im Servlet nicht überschrieben Java Basics - Anfänger-Themen 9
P Servlet unterschiedliche Server Java Basics - Anfänger-Themen 2
W servlet imports nicht unterstützt Java Basics - Anfänger-Themen 3
F Applet --> Servlet --> Applet Java Basics - Anfänger-Themen 2
K Problem mit javax/servlet/http/HttpServletRequest.java Java Basics - Anfänger-Themen 2
J Servlet Error Java Basics - Anfänger-Themen 11
D Aus Anwendung Zugriff auf ein Servlet Java Basics - Anfänger-Themen 5
P konsolen ausgabe bei servlet Java Basics - Anfänger-Themen 2
S Methoden aus einem Servlet in einer JSP verwenden Java Basics - Anfänger-Themen 5
T Wo Daten ablegen für mehrere Servlet-Instanzen? Java Basics - Anfänger-Themen 2
G import javax.servlet cannot be resolved Java Basics - Anfänger-Themen 1
Z Wo wird ein Servlet gespeichert ? Java Basics - Anfänger-Themen 2
I eine Klasse aus der Jar-Datei aus dem Servlet starten Java Basics - Anfänger-Themen 4
N Probleme mit import von javax.servlet.* Java Basics - Anfänger-Themen 3
T komplexe Strukturen in Servlet-Context speichern möglich? Java Basics - Anfänger-Themen 5
T servlet synchronisationsproblem Java Basics - Anfänger-Themen 4
P Servlet wird nicht gefunden Java Basics - Anfänger-Themen 4
A fileupload mit servlet Java Basics - Anfänger-Themen 6
P asynchrone Kommunikation Applet Servlet mit RMI möglich Java Basics - Anfänger-Themen 4
G Übergabe Variablen von Servlet zu JSP? Java Basics - Anfänger-Themen 4
G Formularübergabe in Servlet endet mit null. Java Basics - Anfänger-Themen 2
S Jakarta FileUpload Servlet funktioniert nicht Java Basics - Anfänger-Themen 17
G Servlet gibt über request nur null zurück Java Basics - Anfänger-Themen 3
G problem mit servlet import Java Basics - Anfänger-Themen 4
W servlet nicht gefunden Java Basics - Anfänger-Themen 8
R Servlet - JSP Java Basics - Anfänger-Themen 2
G Servlet geht nicht Java Basics - Anfänger-Themen 5
G hilfe jsp/servlet,jdbc api running on tomcat server+webProxy Java Basics - Anfänger-Themen 8
G Servlet aus programm abfragen Java Basics - Anfänger-Themen 9
H JSP Kein Durchblick. Servlet <-> JSP Java Basics - Anfänger-Themen 7
I Bean<>Servlet ? Java Basics - Anfänger-Themen 6
D Datentransfer via Servlet Java Basics - Anfänger-Themen 2
M Applet sendet daten an servlet und servlet wieder an applet Java Basics - Anfänger-Themen 5
M Servlet position bestimmen Java Basics - Anfänger-Themen 3
J Servlet - Datei auf Server speichern und Ausgabe Java Basics - Anfänger-Themen 5
G Servlet wird nicht importiert? Java Basics - Anfänger-Themen 3
C Servlet & tomcat 5.0.28 Java Basics - Anfänger-Themen 7
S Servlet-Anfänger Java Basics - Anfänger-Themen 4
G Mein Servlet ist "not available" Java Basics - Anfänger-Themen 12
M Kann neues Servlet nicht hinzufügen Java Basics - Anfänger-Themen 5
D Beispiel-Servlet erstellen Java Basics - Anfänger-Themen 4
H Unterbrochener Link im Fomular bei Servlet-Aufruf Java Basics - Anfänger-Themen 4
E Webshop-Servlet: Problem beim Speichern der Bestellmenge Java Basics - Anfänger-Themen 3
M hilfe :} möchte servlet daten erfasssen-> hashmap speiche Java Basics - Anfänger-Themen 3
Z Servlet/Tomcat Problem Java Basics - Anfänger-Themen 3
B Image Matching in Memory Minigame Java Basics - Anfänger-Themen 7
B Memory Spiel Java Basics - Anfänger-Themen 29
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
Olis Erste Schritte Simples Memory Spiel möglich? Java Basics - Anfänger-Themen 1
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
T Art 4 Felder Matrix Memory Java Basics - Anfänger-Themen 2
V Memory Logik Problem/Denkblockade, bitte helft Java Basics - Anfänger-Themen 1
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
pinar memory spiel Java Basics - Anfänger-Themen 10
P NullPointerException in Memory-Spiel Java Basics - Anfänger-Themen 5
P Layout Manager - Welches Layout für Memory? Java Basics - Anfänger-Themen 7
A Java memory leakage Java Basics - Anfänger-Themen 9
T Out of Memory (Java Heap Space) Java Basics - Anfänger-Themen 9
S Datentypen Memory Problem Java Basics - Anfänger-Themen 12
I Memory-Spiel Feld nur einmal mischen Java Basics - Anfänger-Themen 2
O Memory Thread.sleep() Java Basics - Anfänger-Themen 5
K Memory-Spiel stecke Fest Java Basics - Anfänger-Themen 2
K Ein Memory Spiel ! Java Basics - Anfänger-Themen 6
K Memory-Spiel alle verdeckte karten aufdecken. Java Basics - Anfänger-Themen 26
T Memory Leak und der Garbage Collector Java Basics - Anfänger-Themen 21

Ähnliche Java Themen

Neue Themen


Oben