M
Michael2345
Gast
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.
und der Handler
wo hier ein Leck sein soll weis ich nicht.
vielleicht hat jemand von euch eine Lösung.
Gruß Michael
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.
Code:
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
Code:
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