# java.lang.OutOfMemoryError



## Fian03 (20. Aug 2003)

Hallo 

weiß jemand wie ich mein Memory erweitern kann. Dieser Fehler hat ja nix mit den Systemleistungen zu tun, oder?

Danke im Vorraus


----------



## Stefan1200 (20. Aug 2003)

Das Problem hatte ich leider auch, als ich versucht hatte eine sehr große Datei in den StringBuffer zu speichern.

Nach einer Lösung habe ich allerdings noch nicht gesucht.
Vielleicht weiss jemand anderes was?


----------



## mariopetr (20. Aug 2003)

beim start der vm kann man speicher zuweisen
fuehre mal java -X aus
Xmx gibt den maximal belegbaren speicher an
Xms die segement size


----------



## Guest (21. Aug 2003)

Kannst du mir die genaue Syntax zeigen? Ich finde in diversen Büchern keinerlei Info's!   

DANKE

Gruß Fian03


----------



## Fian03 (21. Aug 2003)

Sorry

hatte vergessen mich anzumelden.


----------



## Stefan1200 (21. Aug 2003)

Anonymous hat gesagt.:
			
		

> Kannst du mir die genaue Syntax zeigen? Ich finde in diversen Büchern keinerlei Info's!



Er meint beim Starten von deinem Programm mit java. Nicht in deinem Programm selbst.


----------



## mariopetr (21. Aug 2003)

$JAVA_ROOT/jre/bin/java -X


----------



## Guest (21. Aug 2003)

Ich bin ein Windowsbenutzer. 

In den bin-Ordner finde ich noch, weiß aber nicht wo ich dann hin muss, es gibt unter Win kein 'java -x'. 
Oder ich bin einfach zu dämlich     :?


----------



## mariopetr (21. Aug 2003)

also wenn du dann im [..]/java/jre/bin ordner bist,
gib mal java -help ein. java -X ist die hilfe fuer die extended parameter (-help und -X sind parameter des programmaufrufs "java" und werden mit " " vom programmnamen getrennt)



> Ich bin ein Windowsbenutzer.



_das_ sollte egal sein (solange du ein sun sdk/jre hast)


----------



## aquanox (27. Aug 2003)

Hi,

also Allgemein bedeutet OutOfMemoryError, dass Java keinen weiteren Speicherplatz mehr auf dem System zur Verfügung.

Beispiel:
Das Java Programm braucht mehr Speicher. Gute Betriebssysteme kontrollieren das und geben nicht den gesamten Speicher frei für Programme. Wenn der GarbageCollector keinen Speicher mehr frei bekommt, dann gibts den obigen Fehler.

Lösung:

1. Einfachste Lösung ist mehr Arbeitsspeicher einbauen, da das oft damit zusammenhängt.

2. Speicher, den Java Maximal bekommt:
java -Xmx n Programm.java
(Anstelle n steht dann der Wert plus die Erweiterung für MB (m) oder KB (k))

z.B:
java -Xmx 128m Programm.java (Java hat maximal 128MB Arbeitsspeicher)
java -Xmx 1024k Programm.java (Java hat maximal 1024kB (1,024MB) Arbeitsspeicher)

Das gleiche geht auch um schon am Start den Speicher festzulegen
mit: -Xms als Parameter mit den gleichen Werten.

3.  Auch jemand, der die einfachste Möglichkeit vorzieht hört spätestens auf, wenn alle Slots voll sind.
Besser man durchsucht sein Java Programm und findet die Stellen, die Speicher unnötig vollschreiben.


----------



## mariopetr (27. Aug 2003)

mehr speicher einbauen, bringt erstmal garnichts, man muss schon die parameter Xmx und notfals Xms setzten, allerdings haengt dies auch von dem verwendeten jre (hp jre kann man z.b. als "selbstoptimierend starten").
bei ms jre bin ich mir auch nicht sicher, soviel propritaeren mist wie die machen, windows habe ich auch nicht als das ich es mal testen koennte.

<klugscheiss>
1024kb=1,000Mb
</klugscheiss>


----------



## aquanox (27. Aug 2003)

Ich habe das ganze auf eine Linux Server gehabt und der hatte bei dem Fehler den kompletten Speicher plus Swap partition voll.

Unter Linux wird für Java der gesamte Speicher freigegeben, wenn er denn gebraucht würde.
Windows sperrt das meistens ab, da sonst das System abstürzen würde.

Bei dem obigen Fall gaben die Parameter keine Lösung denn:

Der Parameter Xms stellt den Speicher zum Start schon vorreserviert ein - das wäre nicht nötig, weil Java sich Speicher vom System holt, sollte nochwas gebraucht werden. Hat nur Sinn, wenn man andere Anwendungen laufen hat, die sich sonst zu viel nehmen.

Der Parameter Xmx stellt den maximalen Speicher ein, das bedeutet, dass Java nicht mehr als diesen Wert bekommt auch wenn das System noch genug frei hätte.



Zu deinen Byterechnungen:

MB (Mega = Millionen) und kB (Killo = Tausend)

1024 kb zu MB also duch 1000 sind mathematisch 1,024
(Das Thema geht hier auch nicht um diese Umrechnung, war nur als Beispiel zum Verständnis)


----------



## DTR (27. Aug 2003)

mariopetr hat schon recht:
1 MB = 2^10 KB = 1024 KB

Soviel nur dazu, und jetzt zurück zum Thema.


----------



## mariopetr (27. Aug 2003)

erst
> Unter Linux wird für Java der gesamte Speicher freigegeben, wenn er denn gebraucht würde. 
> Windows sperrt das meistens ab, da sonst das System abstürzen würde. 
dann
> Der Parameter Xmx stellt den maximalen Speicher ein, das bedeutet, dass Java nicht mehr als diesen Wert bekommt auch wenn das System noch genug frei hätte.

sich selbst zu wiedersprechen laesst auf probleme schliessen. zudem wuerde mich mal interessieren, mit welchem jre du das auf linux beobachtet hast. ich arbeite (fast)jeden tag mit java auf hp-ux,linux,freebsd und solaris, bis jetzt hat sich noch jede vm an Xmx gehalten. 

was das Mb angeht, bei mir ist ein Mb=1024kb=2^20b. nur weil die hdd hersteller sich nicht daran halten (die speicherhersteller allerdings schon), mache ich diesen mist nicht mit. im uebrigen musst du dich schon im bezugsrahmen bewegen (bei der angabe der speicherparameter ist 1024kb aequivalent zu 1Mb, woraus man schliessen kann, das (in dem betreffenden raum) 1,024Mb>1024kb.


----------



## aquanox (27. Aug 2003)

Das erninnert mich an die Zeiten wo ich Rechnen in Binär gemacht habe.

Wie oben geschrieben, das Beispiel war hier nicht auf Richtigkeit sondern auf Verständlichkeit.



Ich arbeit nur mit dem jre von sun und dort trat das Problem auf, dass Java sich so viel Speicher genommen hatte, dass für Linux zu wenig übrig war und somit Linux angefangen hat Prozesse zu killen. Das Problem konnte ich nur lösen indem ich die Speichergröße maximiert habe. Oben meinte ich, dass diese Einstellung abhängig vom System ist, das hat nichts mit wiedersprechen zu tun. Unter Windows hatte ich bei dem gleichen Test nämlich keine Probleme mit zu wenig Speicher im System.


----------



## mariopetr (27. Aug 2003)

hmm, seltsam, habe es gerade nochmal ausprobiert

jedesmal -Xmx32M Xms8M

public static void main(String[] args)
{
  List list=new ArrayList();
  int i=0;	
  while(true)
  {
     list.add(new byte[1024*1024]);
     System.out.println(++i);
  }
}

suse linux 8.2 mit sun jdk 1.4.2_01
hp-ux11i mit hp jdk 1.4.2_03
debian "woody" mit blackdown 1.4.1_01

immer die erwartete exception nach ca 30 durchgaengen. nach deinen beobachtungen haette es eintweder nach ca 1000 durchgaengen (1Gb RAM) oder 3000 durchgaengen (1Gb RAM + 2Gb Swap) schief gehen muessen.


----------



## aquanox (27. Aug 2003)

Stimmt, genau das habe ich auch gemeint.

Ohne die Parameter hat Java den Speicher vollgemacht, wobei ich Threads benutzt habe.

Mit Parametern bricht Java mit Exceptions ab - so wie oben beschrieben.


----------



## mariopetr (27. Aug 2003)

naja, aber man fuehrt doch java nie ohne diese parameter aus, wenn man sie nicht setzt steht Xmx auf 64M und Xms auf 8M, ich habe es auch ohne parameter versucht, er hat peunktlich nach 62 durchgaengen abgebrochen. allerdings benutze ich nur hotspot, respektive server auf hp, solaris und bsd kan ich zuhause leider nicht testen.


----------

