Heap-Speicher wieder freigeben

B

Bazinga

Gast
Ich möchte zu einem bestimmten Zeitpunkt in meinem Programm den Speicher des Attributs _data wieder freigeben.
Dies soll durch den Aufruf einer der resetData-Methoden erreicht werden.

Java:
public Vector _data = new Vector();

public void fillData() {
	for (int i = 0; i < 50000; i++) {
		HashMap map = new HashMap();
		map.put("id", i);
		_data.add(map);
	}
}

public void resetData1(){
	_data.removeAllElements();
}

public void resetData2(){
	_data.clear();
}

public void resetData3(){
	_data = null;
}

public void resetData4(){
	_data = new Vector();
}

1. Wenn ich mir in meiner Jboss-Konsole die Memory-Pools ansehe, bleibt der Tenured Gen unverändert. Warum wird der Speicher nicht freigegeben? Muss ich noch ein System.gc() hinterherschicken?
2. Welche Methode zum Reset ist am sinnvollsten? Haben alle den gleichen Effekt? Was sind die Unterschiede im Bezug auf den Speicher?
3. Werden die HashMap-Objekte auch alle vom Speicher gelöscht oder müssen diese vorher noch per remove() geleert werden?
4. Fallen Euch noch andere Punkte an dem Code auf in Bezug auf Speicheroptimiertung, die man verbessern sollte?
 

Marco13

Top Contributor
Vorneweg: Man sollte nicht Vector verwenden, sondern List. Das kann auch ein Vector sein, aber man sollte sich nur auf's List-Interface verlassen (ist allgemeingültiger).
Java:
private List data = new Vector();
bzw. gleich mit Generics
Java:
private List<Map<String, Integer>> data = new Vector<Map<String, Integer>>();

Zum Speicher: FALLS das ganze wirklich nötig ist, sollte man am ehesten Variante 3 oder 4 verwenden. Ein System.gc sollte eigentlich NIE notwendig sein). Die beiden Varianten unterscheiden sich natürlich von ihrer Bedeutung her. Falls man Variante 3 verwendet, muss man bei fillData eben Am anfang
data = new Vector();
reinschreiben.

removeAllElements und clear haben die gleiche Bedeutung, aber letzteres ist aus dem List-Interface und deswegen allgemeiner und besser. Trtozdem werden nur die Elemente entfernt. Die Internen Datenstrukturen (d.h. ein Array) bleiben weiterhin bestehen. Wenn data vorher 1000000 Elemente enthalten hat, existiert nach "clear" immernoch ein Array der Größe >1000000. Also ist es besser, "data" selbst auf null zu setzen.
 
S

SlaterB

Gast
Jsva-Programme geben einmal allokieren Speicher des Betriebssystems nicht mehr ab oder? weiß ich selber auch gar nicht,

innerhald des von Java verwalteten Heap könnte aufgeräumt werden, aber warum zwingend diese Arbeit machen?
solange die Objekte freigegeben sind können sie ruhig noch darum liegen, sie werden schon spätestens dann abgeräumt wenn Platz für anderes innerhalb des Java-Programms benötigt wird,
vor einem OutOfMemomyError
 

Noctarius

Top Contributor
Nein die JVM gibt einmal allokierten Speicher nicht mehr an das OS zurück, da generell davon ausgegangen wird "wenn ein Programm den Speicher einmal gebraucht hat, wird es ihn wieder brauchen". Außerdem beugt das ein wenig der Fragmentierung vor.
 

Tobse

Top Contributor
Wieso willst du den denn freigeben? Setz die Zeiger einfach auf null. Wenn der Speicherplatz gebraucht wird, kommt die Garbage Collection und nimmt ihn sich. Wenn er aber nicht gebraucht wird, kannst du dir den Rechenaufwand zum Freigeben sparen.
 

Noctarius

Top Contributor
Ich versteh nicht diesen Tipp mit "auf Null setzen". Der kommt immer und immer wieder. Es ist Blödsinn und verwirrend für Anfänger / Umsteiger.

Ich kann in Java keine "Freigabe" erzwingen, auch nicht durch null setzen. Sonst kommt noch irgendwer auf die Idee, dass das hier den Speicher für den GC "freigibt":

Java:
public class Foo {
  private final List<Bar> bars = new ArrayList<Bar>();

  public Foo() {
    bars.add(new Bar());

    test();
  }

  publiv void test() {
    Bar bar = bars.get(0);
    bar = null;
  }
}

Weder wird in diesem Fall der Speicher freigegeben, noch kann der GC irgendwas machen, weil weiterhin eine Referenz existiert.
Die EINZIGE sauber Variante ist Variablen-Scope 'as small as possible' zu halten und auch dann muss man verstehen wann der GC eine Instanz wegwerfen darf und wann nicht, null setzen bringt eben nur bedingt etwas (und nur wenn man weiß wann).

PS: Java hat keine Zeiger sondern Referenzen!
 
S

SlaterB

Gast
nur weil von einem Auto die Räder festgebunden sein können, darf man nicht mehr behaupten dass man mit Gas geben vom Fleck kommt?

der Zweck des null-Setzens wurde hier denke ich klar vermittelt bzw. scheint Bazinga auch schon ziemlich klar zu sein,
die Variable geht auf null, das Objekt ist nicht mehr referenziert, GC oder sonstwer könnte aufräumen,

dass eine andere Referenz auf ein Objekt das verhindert ist sonnenklar, wo steht das in Frage?
ein simpler Zusammenhang, kann mich an kein Problem dahingehend im Forum erinnern..

> Variablen-Scope 'as small as possible'
ist natürlich schöner und 99% alle Benutzer haben auch nie Probleme mit Speicher, aber es gibt nunmal Spezialfälle von langlebigen Objekten, die einfach unnütze Daten am Leben halten (nicht zwingend in diesem Thema hier),
da ist null-Setzen genau der einzige korrekte Weg, fertig,
dass man überhaupt darüber nachdenkt zeigt doch eher schon ein Verständnis für Referenzen, für den Grund des Speicherproblems,
die Idee, dass = null übersetzt destroy() heißen könnte trotz anderer Referenzen erscheint mir abwegiger, glaube nicht dass das verbreitet ist
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
Ich füge, weil es auf zwei verschiedenen Ebenen (!) zu diesem Thema passt, mal die ArrayList#clear methode hier ein:
Java:
    /**
     * Removes all of the elements from this list.  The list will
     * be empty after this call returns.
     */
    public void clear() {
	modCount++;

	// Let gc do its work
	for (int i = 0; i < size; i++)
	    elementData[i] = null;

	size = 0;
    }

Die Objekte werden auf 'null' gesetzt, damit der GC sie sich (eventuell!) holen kann - aber der Array ist und bleibt mit seiner vollen Größe bestehen!
 
B

Bazinga

Gast
Vielen Dank, durch eure Antworten konnte ich mein Problem nun lösen. Ich setze das Attribut einfach auf null und warte bis der Gc aufräumt.
 

Noctarius

Top Contributor
aber es gibt nunmal Spezialfälle von langlebigen Objekten, die einfach unnütze Daten am Leben halten (nicht zwingend in diesem Thema hier),

Richtig, du sagst es selber - Spezialfälle. Die Standardantwort auf "wie bekomme ich das Objekt weg" ist aber zu 99% immer "auf null setzen". In 99% der Fälle zeugt das aber von schlechtem Design, diese Spezialfälle eben ausgenommen (z.B. Cache).
 
S

SlaterB

Gast
> Die Standardantwort auf "wie bekomme ich das Objekt weg"
weil diese Frage eben nur dann gestellt wird wenn es wirklich ein solche seltene Situation ist ;)
nein, keine Ahnung, müsste man an kontreten Problem-Foren-Themen klären
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Ist Off-Heap-Speicher dasselbe wie Stack-Speicher? Java Basics - Anfänger-Themen 2
KogoroMori21 Stack und Heap Speicher Java Basics - Anfänger-Themen 1
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
G Min und Max heap Java Basics - Anfänger-Themen 1
M Java heap space Fehlermeldung beheben Java Basics - Anfänger-Themen 3
F speicherort stack oder heap Java Basics - Anfänger-Themen 1
M Algorithmus Max-Heap? Java Basics - Anfänger-Themen 3
P Stack, Heap Java Basics - Anfänger-Themen 13
G Heap Space erhöhen (64bit) Java Basics - Anfänger-Themen 45
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
J Array von Objekten, wie schauts im Heap / Stack aus ? Java Basics - Anfänger-Themen 7
V Heap-Sort Java Basics - Anfänger-Themen 0
M Frage zu Stack und Heap Java Basics - Anfänger-Themen 1
H Heap-Auslasung verdoppelt sich schlagartig Java Basics - Anfänger-Themen 3
M Java Arbeitsspeicherverbrauch, Heap Space error korrigieren? Java Basics - Anfänger-Themen 18
H Heap Java Basics - Anfänger-Themen 4
D Java Heap Space Probleme Java Basics - Anfänger-Themen 7
B Stack/Heap Frage Java Basics - Anfänger-Themen 36
C Warning: Type safety: Potential heap pollution via varargs parameter array Java Basics - Anfänger-Themen 5
S Input/Output Java heap space Java Basics - Anfänger-Themen 8
W Compiler-Fehler "Could not reserve enough space for object heap"... und dann raucht das Programm ab Java Basics - Anfänger-Themen 3
B OOP Zwei gleichnamige Objekte auf dem heap Java Basics - Anfänger-Themen 4
H Heap Java Basics - Anfänger-Themen 2
A Java heap space Java Basics - Anfänger-Themen 11
T Out of Memory (Java Heap Space) Java Basics - Anfänger-Themen 9
D java heap space Java Basics - Anfänger-Themen 6
S Java Heap space trotz -Xmx1024 Java Basics - Anfänger-Themen 10
N Heap Dump Java Basics - Anfänger-Themen 23
C 'OutOfMemoryError: Java heap space' Java Basics - Anfänger-Themen 5
E ternärer Heap in Array-Form Java Basics - Anfänger-Themen 6
L heap space, LinkedList umspeichern Java Basics - Anfänger-Themen 15
E begrenzung des platzes im heap Java Basics - Anfänger-Themen 4
D java.lang.outofmemoryerror java heap space bei Hashtable Java Basics - Anfänger-Themen 3
G Frage zur Heap-Belegung Java Basics - Anfänger-Themen 2
neurox java.lang.OutOfMemoryError: Java heap space Java Basics - Anfänger-Themen 18
B java.lang.OutOfMemoryError: Java heap space bei Musikplayer Java Basics - Anfänger-Themen 7
M Java Heap Space durch Übergang von einer Klasse in die ander Java Basics - Anfänger-Themen 3
N Applet Heap vergrößern Java Basics - Anfänger-Themen 10
G warum heap space problem? Java Basics - Anfänger-Themen 6
G heap size vergrößern Java Basics - Anfänger-Themen 6
S memory heap problem Java Basics - Anfänger-Themen 9
V warum heap space überlastung Java Basics - Anfänger-Themen 2
G error wegen heap space Java Basics - Anfänger-Themen 4
M Beadarf ermitteln für Java heap space Java Basics - Anfänger-Themen 4
M Dateien lesen/schreiben und Heap Space Probleme Java Basics - Anfänger-Themen 8
G Aktuelle Heap-Größe auslesen? Java Basics - Anfänger-Themen 3
G Aus Array einen Heap erstellen Java Basics - Anfänger-Themen 5
D suchbaum out of heap space Java Basics - Anfänger-Themen 8
D Heap erweitern Java Basics - Anfänger-Themen 3
R Java heap space Java Basics - Anfänger-Themen 4
E Heap Size einstellen Java Basics - Anfänger-Themen 7
S OutOfMemoryError: Java heap space Java Basics - Anfänger-Themen 6
J Morgen Java-Klausur. Stack, Heap, Method-Area Java Basics - Anfänger-Themen 2
M Java Heap Space während der Laufzeit ändern Java Basics - Anfänger-Themen 2
E fehlermeldung "java heap space" Java Basics - Anfänger-Themen 21
E wieviele objekte am heap?? Java Basics - Anfänger-Themen 14
B Objekte, bspw. konkret Arraylists,manuell aus Speicher löschen? Java Basics - Anfänger-Themen 70
B Wie speicher ich die Outputs einer Methode in ein Array ein? Java Basics - Anfänger-Themen 1
L Frage zum Speicher bei Arrays Java Basics - Anfänger-Themen 7
L Herunterladbares Java Programm in bestimmten Ordner speicher Java Basics - Anfänger-Themen 3
F BufferedImage Speicher Nutzung Java Basics - Anfänger-Themen 2
TheSorm Problem mit Speicher Klasse Java Basics - Anfänger-Themen 3
S Wo speicher ich bilder und sounds ab? Java Basics - Anfänger-Themen 4
TheSorm Kleine Speicher Klasse Java Basics - Anfänger-Themen 24
H Methoden "Leeren" Speicher auf der Festplatte überschreiben Java Basics - Anfänger-Themen 8
C Variablen Speicher von Variablen erhöhen Java Basics - Anfänger-Themen 5
I Werte im Speicher auswerten ohne Umweg über eine Datei Java Basics - Anfänger-Themen 16
H Input/Output ImageIO.load frisst meinen ganzen Speicher weg! Java Basics - Anfänger-Themen 4
R Online-Speicher Java Basics - Anfänger-Themen 7
M Variablen speicher Java Basics - Anfänger-Themen 8
J FileOutputStream aktuelle Speicher Pfad ausgeben Java Basics - Anfänger-Themen 13
L Wieviel Speicher braucht ein Pixel? Java Basics - Anfänger-Themen 14
P Belegt "null" Speicher? Java Basics - Anfänger-Themen 25
T Erste Schritte Speicher läuft voll, Diashow, Images Java Basics - Anfänger-Themen 7
C Soundwiedergabe in einem Thread - Speicher besser bereinigen Java Basics - Anfänger-Themen 3
H warum speicher und läd mien editor nicht? Java Basics - Anfänger-Themen 24
T MysqlConnect und Speicher Java Basics - Anfänger-Themen 8
nabla Speicher voll, mit dem GC geht's daneben? Java Basics - Anfänger-Themen 7
hdi Programmier-Stil : Speicher vs. Quellcode Java Basics - Anfänger-Themen 67
G Button soll Speicher Dialog aufrufen Java Basics - Anfänger-Themen 10
N Probleme mit Input/OutputStreams, Daten im Speicher verwalte Java Basics - Anfänger-Themen 2
D nicht genug speicher - profiling trotz error Java Basics - Anfänger-Themen 5
A Problem mit nicht ausreichendem Speicher Java Basics - Anfänger-Themen 3
K speicher(String a, int b) Java Basics - Anfänger-Themen 14
N Zugriff auf Virtuelles Speicher Java Basics - Anfänger-Themen 18
J Belegter Speicher eines Ordners Java Basics - Anfänger-Themen 2
C args[] als statische Variablen speicher oder wie? Java Basics - Anfänger-Themen 12
S Ringbuffer-Speicher mit einem Textfile Java Basics - Anfänger-Themen 2
A eingabe von jTextField lesen und speicher Java Basics - Anfänger-Themen 5
D Werte in Array speicher Java Basics - Anfänger-Themen 8
M Hilfe: Speicher freigeben? Java Basics - Anfänger-Themen 4
G Speicher als .txt -gibt ein Problem! Java Basics - Anfänger-Themen 6
A Speicher von VM ändern ohne Parameter Java Basics - Anfänger-Themen 3
S Speicher freigeben? Java Basics - Anfänger-Themen 5
T Größe eines Objektes im Speicher Java Basics - Anfänger-Themen 4
G Wieviel Speicher verbraucht ein Array? Java Basics - Anfänger-Themen 7
D Mit Java auf Speicher zugreifen Java Basics - Anfänger-Themen 3
L-ectron-X Speicher freigeben - Garbage Collection Java Basics - Anfänger-Themen 6
M Variablen Werte nach setzen, bei Abfrage wieder alter Wert Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben