# Server Problem



## Michael2345 (11. Dez 2008)

Hallo
Ich habe ein großes Arbeitsspeicher Problem und weis nicht wie ich das beheben kann.

Problembeschreibung:
Ich habe einen Multithreading Server geschrieben der auch ohne Probleme läuft, wenn nicht der Arbeitsspeicher immer voll laufen würde.
Ich weis jetzt kommt „Speicherleck" aber ich habe die letzten 5 Tage nichts anderes gemacht um nach
 irgendwelchen
Variablen Gesucht die ein Leck verursachen können.
Ich habe mit Profiler nach Lecks gesucht jedoch ohne Erfolg.
Dann habe ich mein Server soweit abgespeckt das eine Client sich nur noch anmelden kann aber trotzdem
 geht der Arbeitsspeicher hoch und das kann ich so lange machen bis ich ein Heap Space Error bekomme.

```
public void runServers() throws ClassNotFoundException {
        /* ServerSocket */
        System.out.println("runServers darf nur einmal ausgelöst werden");
        try {
     
            ServerSocket sock = new ServerSocket(PORT);
            System.out.println("EchoServerThread bereit für Verbindungen");
 
            while(true) {  /* Starten eines neuen Clients */
                try { 
                 Socket  clientSocket = sock.accept();
                 Handler he = new  Handler(clientSocket); 
                 he.start();

               } catch (IOException e) {
                   System.out.println("IO Exception ");
               }          
            }     
        } catch (IOException e) {
            System.err.println("Konnte nicht verbinden: " + e);
            System.exit(-1);
        }
 
    }
```


und der Handler



```
class Handler extends Thread {

        Socket sockes;
        int indexUser = 0;
        /* Setzen der Systemzeit */
        long la = System.currentTimeMillis();

        Handler(Socket s) {
            sockes = s;
            //  fangen = sock;
            System.out.println("Socket =" + sockes.getPort());

        }

        public void run() {
            try {
                /* Lesen vom Clientsocket */
                System.out.println("Hier ich und du");
                /* Abbruch der while-Schleife, wenn done == true */

                boolean done = false;
                int za = 0;
                String name = null;
                String line = null;             
                String  passwort = null;
              
                is = new BufferedReader(new InputStreamReader(sockes.getInputStream()));
                /* Schreiben auf ClientSocket */
                PrintWriter os = new PrintWriter(sockes.getOutputStream(), true);

                while (!done) {
                    if (!done) {
                        try {
                           line = is.readLine();      
                            
                        } catch (Exception e) {
                            done=true;
                        }
                   
                        if (line == null) {
                            done = true;
                        } else {
                            System.out.println("User wird Angemeldet !!! Name =" + line.toString());
                            String[] benutzer = line.split(" ");
                            Statement stmt = Connector.getInstance().getConnection().createStatement();

                            ResultSet rset = stmt.executeQuery("SELECT bname, bpasswort FROM anwender WHERE bname='" + benutzer[0]+ "' and bpasswort='" + benutzer[1] + "'");
                            while (rset.next()) {
                                /* Annehmen von name und passwort */
                                name = rset.getString(1);
                                passwort = rset.getString(2);
                                System.out.println("passwort anmeldung OK =" + rset.getString(2));                              
                            }
                         }                        
                     is.close();
                    }                    
                }
              line=null;

            } catch (IOException ex) {
                Logger.getLogger(Echo_Aktuall.class.getName()).log(Level.SEVERE, null, ex);
            }catch (NullPointerException ex) {
                try {
                    System.out.println("Abgefangen");
                    is.close();
                } catch (IOException ex1) {
                    Logger.getLogger(Echo_Aktuall.class.getName()).log(Level.SEVERE, null, ex1);
                }
            }
            catch (SQLException ex) {
                Logger.getLogger(Echo_Aktuall.class.getName()).log(Level.SEVERE, null, ex);
            } 
        }
    }
```

wo hier ein Leck sein soll weis ich nicht. 
vielleicht hat jemand von euch eine Lösung.

Gruß Michael


----------



## Ebenius (11. Dez 2008)

Hab nur kurz draufgeguckt und weiß nicht, ob's Dein Problem löst, aber in der Schleife unten musst Du auf jeden Fall (in dieser Reihenfolge)
ResultSet schließen
Statement schließen
Connection schließen
Grüße, Ebenius


----------



## Guest (11. Dez 2008)

Danke genau das war es. 
Danke.


----------



## Ebenius (11. Dez 2008)

Juchuuu


----------

