# ArrayList Out of Memory



## Christian76 (31. Mai 2007)

Hallo,

ich habe mal ein Frage über die ArrayListen. Ich befülle eine ArrayList mit JButton solange bis folgenden
Meldung erscheint:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space



```
for (int i = 0; i < 10000; i++) 
        {
                    ArrayListe.add(new JButton("Knopf"));
        }
```


Ist die maximale Größe überschritten? Kann ich den Bereich vergrößern?

Gruß

- Christian


----------



## The_S (31. Mai 2007)

Du hast den maximalen Speicherverbrauch erreicht, d. h. deine VM hat keinen Arbeitsspeicher mehr. Du könntest den HeapSize erhöhen, oder über eine alternative nachdenken, wie du keine 10000 grafische Elemente in einer Liste unter bekommst :roll: .


----------



## Guest (31. Mai 2007)

Ok, das hat natürlich keine Praxisrelevanz, wollte nur mal schauen wieviele ich da reinkriegen, bzw, was ich so alles
in die ArrayList laden kann.

Also ich kenne das von C++, die Klasse VECTOR. Die kann man ja schon beliebig groß konfigurieren.

Aber wie kann ich bei meiner JVM die Heap vergrößern?


----------



## SlaterB (31. Mai 2007)

'JVM Heap vergrößern'
bei google eintippen?


----------



## madboy (31. Mai 2007)

java -Xms<initial heap size> -Xmx<maximum heap size>



> Also ich kenne das von C++, die Klasse VECTOR. Die kann man ja schon beliebig groß konfigurieren.


Im Prinzip schon, aber wenn dir der Arbeitsspeicher (+ evtl. swap) ausgeht, ist da auch Schluß :wink:


----------



## The_S (31. Mai 2007)

Da musst du aber noch was anderes im Speicher haben. Ich bekomme Standardmäßig 84955 Buttons in meine ArrayList  .

Bei allgemeinen Fragen wie den Heap von der VM erhöhen solltest du in Zukunft die Forensuche nutzen, auch deinen Fehler hättest dir durch die Forensuche erklären lassen können. Du bist nämlich nicht der Erste, der so ein Problem hat  .

Also, den Verfügbaren Speicher erhöht man beim Starten der Applikation durch den Parameter -Xmx256m (hier 256MB Speicher)

[edit] Hui, da war ich mal wieder langsam


----------



## Guest (31. Mai 2007)

Klasse, wunderbar. Wiedermal danke für eure schnelle Hilfe.

Gruß
- Christian


----------



## Guest (31. Mai 2007)

aber nochmal was anderes die JVM Syntax, oder besser die Ausschnitte die ihr mir gezeigt habt (java -Xms<initial heap size> -Xmx<maximum heap size> ), gibs dafür eine Liste mit allen?


----------



## Leroy42 (31. Mai 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Ich bekomme Standardmäßig 84955 Buttons in meine ArrayList  .


Moment...


			
				Textpad hat gesagt.:
			
		

> ...
> 89381
> 89382
> 89383
> ...



Meiner _geht voller_!


----------



## Leroy42 (31. Mai 2007)

Anonymous hat gesagt.:
			
		

> gibs dafür eine Liste mit allen?



Klick dich durch


----------



## The_S (31. Mai 2007)

Mit nem leeren JButton komm ich sogar auf 91708


----------



## Leroy42 (31. Mai 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Mit nem leeren JButton komm ich sogar auf 91462



Mist   , hast gewonnen.

Aber das interessiert mich jetzt mal; Woran liegt das?


```
import java.util.*;
import javax.swing.*;

public class Test {
	public static void main(String[] args) {
		List<JButton> list = new ArrayList<JButton>();
		for (int i=1; i <= 100000; i++) {
			list.add(new JButton());
			System.out.println(i);
		}
	}
}
```
gibt bei mir 89 383 Buttons, aber *jede* JVM bekommt doch
die gleiche Menge Speicher zugewiesen; also woher könnten die
Unterschiede kommen?  ???:L


----------



## The_S (31. Mai 2007)

1. Edit beachten, ich komme jetzt auf 91708.
2. Wenn ich der ArrayList einen entsprechend intelligent gewählten Initalisierugnswert zuweiße, bekomme ich noch mal ein paar mehr rein
3. Ohne Initialisierungswert komme ich immernoch auf 91242, denke mal das liegt daran, dass du noch einen FileWriter laufen hast, der dir die Ausgabe in eine Textdatei speichert


----------



## Leroy42 (31. Mai 2007)

Natürlich!

auf *3.* hätte ich möglicherweise auch
selbst kommen können.

*2.* ist ja vollkommen logisch


----------



## Christian76 (31. Mai 2007)

ich glaube meine Frage ist irgendwie untergegangen,

wo finde ich eine Liste mit den JVM Code wie z.B.

-Xmx256m


----------



## Leroy42 (31. Mai 2007)

Habe ich dir doch schon mit einem Link beantwortet.  :shock: 

Dort, oben rechts in der Leiste, auf "Tool Docs" und dann auf "Basic Tools" klicken.


----------



## Guest (31. Mai 2007)

sorry


----------



## Guest (31. Mai 2007)

bleiben wir doch beim Thema 
mmh, weis jemand warum die Exception nicht abgefangen wird!


```
import java.util.ArrayList;

public class Main 
{
    public static void main(String[] args)
    {
        ArrayList List = new ArrayList();
        double test = 3;
        while(true)
        {
            try
            {
                List.add(test);
            }
            catch(Exception e)
            {
                System.out.println("FEHLER: " +e.toString());
                break;
            }
        }
    }
}
```


----------



## The_S (31. Mai 2007)

Weil es ein OutOfMemory*Error* ist und keine OutOfMemory*Exception* und somit nicht von Exception abgeleitet ist, sondern von Error.


----------



## Guest (31. Mai 2007)

wiedermal danke!!!


----------



## Guest (31. Mai 2007)

damit kann man lustige Sachen machen!! 



> compile:
> run:
> #
> # An unexpected error has been detected by Java Runtime Environment:
> ...


----------



## Guest (31. Mai 2007)

gibt es eigentlich Methoden mit den ich z.B. die belegten Speicher abfragen kann?


----------



## The_S (31. Mai 2007)

Hm, das ist widerrum unnormal. So eine Textdatei wird nur bei einer nicht definierten Ausnahme in der VM generiert und ist folglich idR ein Bug. Poste doch mal deinen kompletten Code, der diesen Fehler erzeugt ...


----------



## Guest (31. Mai 2007)

ich übergebe als Syntax der Java Console:  -Xmx1300m

hier mein Code:


```
import java.util.ArrayList;

public class Main 
{
    public static void main(String[] args)
    {
        ArrayList List = new ArrayList();
        double test = 3;
        while(true)
        {
            try
            {
                List.add(test);
            }
            catch(Error e)
            {
                System.out.println("HEAP voll: " +e.toString());
                break;
            }
        }
    }
}
```


----------



## madboy (31. Mai 2007)

> java.lang.OutOfMemoryError: requested 167772160 bytes for GrET in C:\BUILD_AREA\jdk6\hotspot\src\share\vm\utilities\growableArray.cpp. Out of swap space?





			
				Gast hat gesagt.:
			
		

> ich übergebe als Syntax der Java Console: -Xmx1300m


Wieviel Arbeitsspeicher hast du und wie viel Swap? Wenn die Summe kleiner als 1.3 GB + Speicher für OS + Apps  ist, ist die Fehlermeldung irgendwie einleuchtend :wink:


----------



## Guest (31. Mai 2007)

hab hier ne Windowsmaschine mit 3,5 GB RAM.


----------



## Ark (31. Mai 2007)

Die try-catch-Anweisungen sind dazu da, Exceptions abzufangen, keine Errors! Wenn ein Error auftritt, kannst du als Programmierer mit an Sicherheit grenzender Wahrscheinlichkeit nichts mehr machen, außer dein Programm abstürzen zu lassen.

Ark


----------



## SlaterB (31. Mai 2007)

try/catch Error oder gleich Throwable GEHT genauso,
ob man das machen sollte ist durchaus die Frage, ja


----------



## Guest (31. Mai 2007)

aber nochmal zu meiner Frage:

gibt es eigentlich Methoden mit den ich z.B. die belegten Speicher abfragen kann?


----------

