# HTTP Server Memory Leak?



## Roland34 (29. Okt 2008)

Hallo,
Ich habe fogende Code mit Hilfe von java Doku implementiert. Aber ich sehe den Speicherverbrauch  mit der Zeit immer erhöht wirrd. Hat jemand  mit so was Erfahrung. Oder war da ein Bug in VM. Ich wevwende jdk1.6.0_06
Für jede Hilfe, Idee bin ich dankbar.


```
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

class Server implements HttpHandler
{
  public void handle( HttpExchange httpExchange ) throws IOException
  {
    httpExchange.getResponseHeaders().add( "Content-type", "text/html" );
    String response = "test ";
    httpExchange.sendResponseHeaders( 200, response.length() );

    OutputStream os = httpExchange.getResponseBody();
    os.write( response.getBytes() );
    os.close(); //
  }
  public static void main(String[] args) {
     HttpServer server = null;
     try {
      server = HttpServer.create( new InetSocketAddress( 80 ), 0 );
     } catch(IOException e) {
       
     }
       server.createContext( "/", new Server() );
       server.start();

}
}
```


----------



## Lim_Dul (29. Okt 2008)

Größer tut ja erstmal nicht weh. Nur weil ein Object (z.b. der Outputstream) nicht mehr benötigt wird, wird der Speicher nicht sofort freigegeben. Das macht die VM irgendwann, wenn es ihr passt.

Du könntest mal den Speicher für das Programm massiv runterdrehen, so dass es nur knapp über dem ist, was benötigt wird. Wenn es dann nach einiger Zeit mit einem OutOfMemoryError abbricht, ist wirklich eins vorhanden.

Ich gehe aber stark davon aus, dass das kein Speicherleck vorliegt, sondern die VM einfach "zu faul" ist, den Speicher freizugeben, da ja noch genügend da ist.


----------



## tuxedo (29. Okt 2008)

Ein Profiler kann dir weitere Details liefern ...

>> Aber ich sehe den Speicherverbrauch mit der Zeit immer erhöht wirrd.

Nenn mal ein paar Zahlen... Um wieviel MB wächst das ganze in welchem Zeitraum? "Überlebt" die Anwendung mehrere Tage Dauertest?

- Alex


----------



## Roland34 (29. Okt 2008)

Ich habe den Server laufen lassen und einfach mit firefox aktualisiert.  Dann wächst den Speicher . Ich habe es mit task manager in winxp beobachtet.

Kurz zu mein allgemeines Problem:

Mein Problem ist,  dass meine Anwendung zu oft Zugreiffe auf den Web server macht. Es kommt nach eine weile zu OutOfMemoryError.


----------



## HoaX (29. Okt 2008)

probiers halt mal mit nem "richtigen" httpserver wie tomcat oder jetty, zumindest letzterer lässt sich genauso leicht integrieren wie das komische teil von sun (wieso benutzen viele das überhaupt?)


----------



## Roland34 (29. Okt 2008)

Ich habe ein Heapdump auch gemacht.

sun.net.httpserver.ServerImpl als verdächtig aus. Was kann das sein?

Ich vermute, der connection wird nicht zu gemacht.  Weiß jemand einfach das zuzumachen?
In Doku finde ich so was nicht.

Danke für jede Hilfe!


sun.net.httpserver.ServerImpl @ 0x25b1a4c8
java.util.Collections$SynchronizedSet @ 0x25b20648
java.util.HashSet @ 0x25b408f0
java.util.HashMap @ 0x25b487c8
java.util.HashMap$Entry[2048] @ 0x2685cc00
java.util.HashMap$Entry @ 0x25f9e430
java.util.HashMap$Entry @ 0x26944478
java.util.HashMap$Entry @ 0x26907aa0
java.util.HashMap$Entry @ 0x25987fb0
java.util.HashMap$Entry @ 0x25f3d5d0
java.util.HashMap$Entry @ 0x2647b528
java.util.HashMap$Entry @ 0x25971470
java.util.HashMap$Entry @ 0x25cdf598
java.util.HashMap$Entry @ 0x263837e0
java.util.HashMap$Entry @ 0x2642b188
java.util.HashMap$Entry @ 0x2691d050
java.util.HashMap$Entry @ 0x25980de0
java.util.HashMap$Entry @ 0x25a2ccc0
java.util.HashMap$Entry @ 0x25a63a70
java.util.HashMap$Entry @ 0x26109460
java.util.HashMap$Entry @ 0x263ef660
java.util.HashMap$Entry @ 0x263ef738
java.util.HashMap$Entry @ 0x265d8940
java.util.HashMap$Entry @ 0x25a92668
java.util.HashMap$Entry @ 0x25fd41e8
java.util.HashMap$Entry @ 0x25a94b58
java.util.HashMap$Entry @ 0x25f16a10
java.util.HashMap$Entry @ 0x2604e068
java.util.HashMap$Entry @ 0x260d20f0
java.util.HashMap$Entry @ 0x26109418


----------



## tuxedo (29. Okt 2008)

Schau doch in den Sourcecode .. Da scheint eine HashMap nicht abgeräumt zu werden. Oder du hast irgend einen Call vergessen der die HashMap aufräumt.

- Alex


----------

