# java.lang.OutOfMemoryError



## Flyer (14. Okt 2004)

habe folgenden Fehler beim Ausführen meines Programms!
java.lang.OutOfMemoryError

wie kann es korrigieren das es läuft?
wie kann ich den speicher erhöhen? oder wie kann ich es schaffen das weniger speicher gebraucht wird, dasss der Fehler nicht auftritt?

Gruss Flyer


----------



## foobar (14. Okt 2004)

Setz alle Variablen die du nicht mehr brauchst auf null, dann wird beim nächsten Lauf des Garbage Collectors aufgeräumt.


----------



## Sky (14. Okt 2004)

Speichererhöhung: 
Option "-Xmx256m" (max-wert setzen)
Option "-Xms256m" (start-wert setzen)


Speicherverbrauch reduzieren:
Also, pauschal gibt es darauf keine Antwort. Du mußt dein Prog. mal profilen. Was auf jeden Fall speicher kostet:
- viele Strings mit dem '+'-Operator konkatinieren. 
- Wrapper-Klassen anstatt primitive Datentypen nutzen (wenn nicht unbedingt erforderlich
- noch ganz viele andere Dinge. Pauschal-Antwort -wie gesagt- nicht möglich


----------



## Roar (14. Okt 2004)

hier hat mal einer gesagt dass er bei seinem programm eifnach nebenbei einen timer hat laufen lassen der alle 5 minuten oder so den garbage collector aufruft, danach hats bei ihm geklapt. vielleicht hiflt dir das ja auch.

oder du hast n fehler in deinem code :-/

edit: das hat nix mit awt&swing zu tun, ich verschieb das mal.


----------



## Flyer (14. Okt 2004)

Danke für eure Antworten!

Gibt es auch externe Programme die solche "speicherverschwendung" erkennt? bzw. die einem zeigt wo am meisten speicher verloren ging?

Gruss Flyer


----------



## Sky (14. Okt 2004)

Ja. Im JDK mitgeliefert findest Du den sog. *hprof*. Den läßt Du mit der Option *-Xrunhprof...* mitlaufen. '...' steht für weitere Einstellungsmöglichkeiten, einfach mal im Netz danach suchen.
Ansonsten kann ich Dir auch noch OptimizeIt empfehlen. Das Kost' aber extra...


----------



## bygones (14. Okt 2004)

Roar hat gesagt.:
			
		

> hier hat mal einer gesagt dass er bei seinem programm eifnach nebenbei einen timer hat laufen lassen der alle 5 minuten oder so den garbage collector aufruft, danach hats bei ihm geklapt. vielleicht hiflt dir das ja auch


Naja - davon bin ich nicht so überzeugt. Auch der direkte Aufruf des Gc heißt nicht automatisch dass das Programm performanter wird... Man sollte es nicht als Allzweckwunderwaffe sehen.

Wenn du mit eclipse arbeitest gibt es da genügend Plugins die die Profilerarbeiten für dich leisten (z.b. EclipseProfiler)


----------



## Guest (14. Okt 2004)

System.gc() innerhalb des GUI Threads bringt höchstens ein 
auffällig langsames Rektionsverhalten der Anwendung.

Java ist halt verdammt verschwenderisch mit Speicher. Damit muss 
man leben. Man kann höchstens dafür sorgen, das keine unnötigen 
Objekte erzeugt werden, indem man sie wiederverwendet oder erst 
gar nicht erzeugt. (Object-Pool etc.).

Zuerst aber die Stellen lokalisieren, die den meisten Speicher verbrauchen.
Es bringt wenig sofort mit Optimierung jeglicher Art anzufangen, um
dann festzustellen, dass man den 5% Fall optimiert hat.
Optimierungen sollen messbar und nachvollziehbar sein.

Hough, ich habe gesprochen  8)


----------



## phillli (19. Nov 2004)

Naja, Thema schon veraltet, aber ich habe gleiches Problem.

Die Stellen, wo mir Speicher vorloren geht, ist leicht gefunden. Alle paar Zeilen einfügen:
System.out.println("xx_freememory: "+Runtime.getRuntime().freeMemory());

Heisst aber noch lange nicht, dass das Problem gelöst ist. Was, wenn ich da Speicher verbrauche, wo es sich nicht umgehen lässt? Naja, mein Problem...


----------



## Sky (19. Nov 2004)

phillli hat gesagt.:
			
		

> Was, wenn ich da Speicher verbrauche, wo es sich nicht umgehen lässt? Naja, mein Problem...



Die Frage ist: Läßt es sich nicht umgehen oder weißt Du nicht, wie es sich umgehen läßt!? Ich habe am Anfang auch nicht so recht gewußt, wie man Performance rausholen kann und gedacht, dass es so sein muss (wegen der Fachlogik). 
Die Erfahrung hat mich gelehrt, dass es oftmals doch eine andere Lösung gibt. Ein ganz banales Beispiel: Ich hatte damals eine Schleife, die ca. 25.000 mal durchlaufen wurde. In der Schleife wurden zum Teil Strings mit einander verbunden. Ich bin an der Stelle von String auf StringBuffer umgestiegen und habe die Performance um einen Faktor größer 1.000!
Es gibt noch mehr Beispiele. Insbesondere bei Schleifen und beim Anlegen von Objekten.


----------



## phillli (19. Nov 2004)

ja, mag sein. ich arbeite mit Bildern, die z.T. recht gross sind. 
Das wirklich blöde ist, dass die wichtige Klasse nicht von mir ist, ich muss sie also modifizieren, und dafür erst mal verstehen.

Suche gerade auch schon Lösungen, wie ich meine Datenmenge reduzieren kann. Wenn ich mal mehr konkrete Fragen habe, melde ich mich wieder...


----------



## thE_29 (19. Nov 2004)

Sind den die Strings wenn ich die mit + anstatt mit stringbuffer append (obwohl das ja das gleich ist) wirklich Speicher/Zeitintensiver??


----------



## Sky (19. Nov 2004)

thE_29 hat gesagt.:
			
		

> Sind den die Strings wenn ich die mit + anstatt mit stringbuffer append (obwohl das ja das gleich ist) wirklich Speicher/Zeitintensiver??



ja, weil bei "Strings" und "+" immer wieder neue Objekte erzeugt werden müssen.

Der folgende Code

```
String s = new String();
    StringBuffer sb = new StringBuffer();
    int iMax = 25000;

    long t1 = System.currentTimeMillis();
    for ( int i = 0; i < iMax; i++ ) {
      s += String.valueOf(i);
    }
    System.out.println("String: " + (System.currentTimeMillis()-t1) );


    long t2 = System.currentTimeMillis();
    for ( int i = 0; i < iMax; i++ ) {
      sb.append( String.valueOf(i));
    }
    System.out.println("StringBuffer: " + (System.currentTimeMillis()-t2) );
```
 brachte bei mir folgendes Ergebnis:
	
	
	
	





```
String: 77219
StringBuffer: 16
```


----------



## thE_29 (19. Nov 2004)

Oha, das ist ja wirklich schneller!

Naja, ich hab überall +  Aber ich mache ja keine Echtzeitsimulationen damit :bae:


----------

