# Java heap space



## Achim1980 (5. Dez 2011)

Hallo!

Ich habe ein einfaches Beispiel programmiert, welches einen Exception in thread "main" java.lang.OutOfMemoryError: Java heap space Error bringt.

Der Code macht nichts anderes als ein Objekt Compound erzeugen und dieses in eine ArrayList aufnimmt. Weil es schnell gehen sollte, habe ich sämtliche ArrayLists im Compound Objekt mit "new ArrayList()" initialisiert. Nach ca. 190000 Durchläufen der Schleife wird der Fehler ausgegeben.
Der Fehler kommt AUCH, wenn ich das Objekt Compound "leer" initialisiere, also mit:

Compound c =new Compound();

Wie kann ich programmieren, ohne einen Memory Fehler zu bekommen?


```
public static void main(String[] args)
	{
		int maxSize=500000;
		ArrayList<Compound> compounds=new ArrayList<Compound>();
		
		System.out.println("Start");
		
		for(int i=0; i<maxSize;i++)
		{
			Compound c=new Compound(new ArrayList(), 2,  "Achim", 3453.5, new ArrayList(), new ArrayList(), new ArrayList(), new ArrayList(), 13212321, 123213, new ArrayList(), new ArrayList(), new ArrayList(), 1222.2, 3243242,  1213, 213, 123.3, new Peak());
			
			compounds.add(c);
			
			System.out.println(i);
		}
		System.out.println("Finished");
		
	}
```


----------



## tfa (5. Dez 2011)

Erhöhe den Heap-Space beim starten des Programms:
http://www.java-forum.org/java-basics-anfaenger-themen/125263-java-heap-space.html


----------



## Gast2 (5. Dez 2011)

Das nenn ich mal nen Konstruktor 

Du erstellst 500k (wie es scheint) große komplexe Objekte. Die verbrauchen natürlich alle nen gewissen Speicher. Du kommst mit dem Standardspeicher wohl einfach nicht hin.

Mit der option -Xmx2000M kannst du dein Programm mit 2GB heap space starten. Falls du zuviel Speicher brauchst, dann lohnt es sich eventuell auch über die Datenstruktur in deinem Programm nachzudenken.


----------



## Achim1980 (5. Dez 2011)

Du hast Recht, den Heap Space erhöhen bringt da was.
Aber setzt zB maxSize auf 5000000, dann kommt der heap space error wieder, diesmal halt erst bei ca. 1000000 Schleifendurchläufen.
Was mache ich dann?


----------



## Gast2 (5. Dez 2011)

Du hast auf einem Rechner nunmal nur endlich viel Speicher zur Verfügung, damit musst du dann auskommen.
Frag dich z.b. mal ob du wirklich alle 5mio Compound instanzen im Speichern haben musst? Reicht dir nicht vielleicht auch nur nen kleiner Teil davon?


----------



## tfa (5. Dez 2011)

> Was mache ich dann?


Irgendwann ist der Speicher halt voll. Dann musst du dein Programm so ändern, dass weniger Speicher verbraucht wird oder nicht alle Objekte gleichzeitig existieren müssen.


----------



## Achim1980 (5. Dez 2011)

Hi!

Wie kann ich denn nur ein Teil der Compounds im Speicher halten??
Wie könnte das aussehen?


Vielen Dank!


----------



## tfa (5. Dez 2011)

Was willst du denn überhaupt machen mit deinen Compounds?


----------



## emailundlos (5. Dez 2011)

Die Dinger werden ja in diesen Fall nur ausgegeben. Das heißt, du müsstest sie auch nicht zusätzlich festhalten. Wenn doch, müsstest du dir datenstrukturmäßig überlegen, wie nur benötigte Teile der Dinger festgehalten werden sollten.


----------



## Achim1980 (5. Dez 2011)

Ich muss die Compounds von vorne bis hinten durchgehen und Muster finden, zB immer 4 Compounds finden welche zueinander einen definierten Abstand haben (sogenannte Quadupel oder Quadruplets).
Wenn ich nur einen Teil der Compoundliste nehme (weil der Speicher es nicht anders zulässt) und nach 4er Mustern suche, so "verpasse" ich eventuell mehrere Quadrupel, falls ein Teil davon in dem noch nicht prozessierten 2ten Teil der Liste vorkommt ect....

Grüsse,


----------



## Gast2 (5. Dez 2011)

Achim1980 hat gesagt.:


> Wie kann ich denn nur ein Teil der Compounds im Speicher halten??
> Wie könnte das aussehen?


Alle Compounds die du grad nicht brauchst speicherst du dir irgendwo weg. Z.b. in eine Datei oder eine Datenbank.
Wenn du die Compounds dann brauchst lädst du dir die wieder in den Speicher.

EDIT:


> zB immer 4 Compounds finden welche zueinander einen definierten Abstand haben


Das ist doch schonmal nen guter Ansatz. Betrachtest du einen Compound interessieren dich nur diejeningen Compounds im Umkreis X. Alle anderen musst du nicht im Speicher haben


----------



## langhaar! (5. Dez 2011)

Wenn ich sowas sehe, komme ich mir verarscht vor:

http://www.java-forum.org/java-basics-anfaenger-themen/128145-java-memory-leakage.html

Antwort gefällt nicht?
Na, dann mal schnell einen neuen Thread hinterherschieben.
Komisch, dass die Antworten auf's gleiche hinauslaufen...


----------

