# Heap Overflow



## Fretful (2. Jun 2006)

Ich habe n Problem mit meinem Programm, nach einer gewissen anzahl von abfragen und funktionsaufrufen meldet Netbeans einen Heapoverflow ! --- In der Systemsteuerung braucht mein java programm dann einige Hundert Megabyte !!! Ich glaube es liegt daran, dass ich Tabellen mit Datenbankobjekten fülle die aber bei bestimmten Aktionen neu ausgelesen werden müssen und ich dabei jedesmal einen neuen Vector anlege. Ist es sinnvoll jedesmal den GarbageCollector aufzurufen?! bzw. wie kann ich diesen exziplit aufrufen?


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


----------



## Wildcard (2. Jun 2006)

Ich sehe 2 mögliche Ursachen für dein Problem:
1. Dein Programm braucht wirklich so viel Speicher  :autsch: 
 dann müsstest du die Heapsize der VM erhöhen.
2. Du sagst du erstellst immer einen neuen Vector. Vermutlich hast du aber irgendwo noch alte Referenzen auf deine Objekte und das hindert den GC am aufräumen.
Lass mal einen Profiler über dein Programm laufen und zieh dir Heap-dumps.


----------



## Illuvatar (2. Jun 2006)

Vielleicht hilft dir auch dieser Link weiter.


----------



## AlArenal (2. Jun 2006)

Illuvatar hat gesagt.:
			
		

> Vielleicht hilft dir auch dieser Link weiter.



Kommt mir bekannt vor


----------



## Fretful (2. Jun 2006)

Danke für die schnelle antwort! habe n bild angehängt wo ihr auch gleich seht was viel Speicherplatz braucht. Wie kann ich ResultSets bzw. Statements wieder freigeben nachdem ich sie nicht mehr benötige ?


----------



## Wildcard (2. Jun 2006)

Fretful hat gesagt.:
			
		

> Danke für die schnelle antwort! habe n bild angehängt wo ihr auch gleich seht was viel Speicherplatz braucht. Wie kann ich ResultSets bzw. Statements wieder freigeben nachdem ich sie nicht mehr benötige ?


Du musst sicherstellen das du keine strong references auf nicht mehr benötigte Objekte hälst damit sie vom GC eingesammelt werden können.
Wenn du eine große Menge von Objekten auf einmal freigibst kannst  du auch über Sytem.gc() den GC manuel aufrufen. In der Regel ist das allerdings nicht nötig und eine sofortige Ausführung auch nicht garantiert.


----------



## Illuvatar (2. Jun 2006)

AlArenal hat gesagt.:
			
		

> Illuvatar hat gesagt.:
> 
> 
> 
> ...



Woher hab ich den nur


----------



## Guest (14. Jul 2006)

Guten Morgen,

ich habe glaube ich das gleiche Problem.
Ich fülle eine JTable mit "addRow(vector)".

Das mach ich ziemlich oft. Irgendwann bekomme ich eine "Java Heap Exception".

Der Quellcode sieht etwa so aus:


```
Vector rowVector = new Vector();
      rowVector.add("text1");
      rowVector.add("text2");
      
      ((TableModel)table.getModel()).addRow(rowVector);
```

Ich denke das "vector" nicht freigegeben werden kann, weil noch eine Referenz darauf da ist, oder?

Wie kann ich das an dieser Stelle umgehen?
"rowVector" wird vom Programm normalerweise hier nicht mehr benötigt.

Danke,
Reinhard


----------



## Reinhard (14. Jul 2006)

Der letzte Beitrag war von mir (war aber nicht eingeloggt)


----------



## Guest (26. Sep 2006)

Wie wärs mit:



```
Vector rowVector = new Vector(); 
      rowVector.add("text1"); 
      rowVector.add("text2"); 
      
      ((TableModel)table.getModel()).addRow(rowVector);

    rowVector=null;
```
??


----------

