Hallo liebes Forum,
ich habe ein paar grundsätzliche Fragen zum Heap Space und dem Garbage Collector.
Im Spoiler findet ihr ein Paar Gedankengänge von mir und den Hintergrund des Problems.
Wer den Text nicht lesen möchte kann das überspringen.
So wie ich das nach einlesen in das Thema verstanden habe, bestehen bei mir noch Referenzen auf Objekte. Deswegen werden diese nicht gelöscht. Wie vermeide ich das. (meine panels werden removed, die Arrays = Null gesetzt, SeriesCollection mit remove entfernt, der GC aufgerufen, das Panel geupdatet)
Auf was sollte ich grundsätzlich beim programmieren achten um meinen Speicher nicht zuzumüllen?
Lieber Objekte in Methoden erstellen oder Global?
Private Public oder Final benutzen ?
Gibt es eine Möglichkeit zu sehen, welche Objekte sich noch in meinem Heap befinden ?
Warum kommt es manchmal dazu, das mein GC nach Aufruf z.B. 20MB frei räumt und dann ohne das sich der Speicher in der Zwischenzeit verändert hat, nach erneutem Aufruf nochmal 10 MB entfernt werden.
An alle die mir Helfen ein großes THX.
ich habe ein paar grundsätzliche Fragen zum Heap Space und dem Garbage Collector.
Im Spoiler findet ihr ein Paar Gedankengänge von mir und den Hintergrund des Problems.
Wer den Text nicht lesen möchte kann das überspringen.
Ein kurzes Beispiel. Ich habe einen Button, der führt bei Betätigung eine SQL Abfrage durch und dann eine Zeichnung mittels JFreeChart.
Betätige ich den Button nochmals, wird eine zweite Zeichnung hinzugefügt usw.
Desweiteren gibt es einen "Alles löschen" Button.
Beobachte ich mein Programm mit VisualVM komme ich zu 1. Erkenntnis.
1. Der Used Heap steigt nicht gleichmäßig an.
Z.B. steigt er beim ersten Aufruf um 30MB, dann um 20MB und dann um 40MB etc.
Und zur 2. Erkenntnis, selbst nach dem Entfernen bleibt etwas Speicher im Heap zurück.
2. Führt also dazu, dass nach längerer Benutzung mein Speicher vollläuft.
(Ich weiß das man den Speicher vergrößern kann, das verlegt das Problem aber nur zeitlich)
Im Idealfall würde ich erreichen wollen, das wenn der "Alles löschen" Button gedrückt wird, der Heap Space wieder auf einen Anfangswert zurück springt.
Dazu habe ich versucht die ganzen Arrays und Vektoren global zu deklarieren und
zu setzen und danach den GC aufzurufen.
Dies hat schon ein bisschen was gebracht. Allerdings bleiben nunmehr von einem "Alles löschen" zum nächsten "Alles löschen" ~20MB im Speicher. (Vorher waren es ~60MB)
Ich habe bisher verschiedene Sachen ausprobiert z.B. Klassen, Funktionen mit private, public, final zu deklarieren das hat zu Veränderungen im Speicher geführt, wobei ich nicht eindeutig sagen kann, ob grundsätzlich gut oder nicht.
Wie sieht es mit dem deklarieren von Variablen aus?
Besser alles global, oder in Subclasses aufrufen ?
Betätige ich den Button nochmals, wird eine zweite Zeichnung hinzugefügt usw.
Desweiteren gibt es einen "Alles löschen" Button.
Beobachte ich mein Programm mit VisualVM komme ich zu 1. Erkenntnis.
1. Der Used Heap steigt nicht gleichmäßig an.
Z.B. steigt er beim ersten Aufruf um 30MB, dann um 20MB und dann um 40MB etc.
Und zur 2. Erkenntnis, selbst nach dem Entfernen bleibt etwas Speicher im Heap zurück.
2. Führt also dazu, dass nach längerer Benutzung mein Speicher vollläuft.
(Ich weiß das man den Speicher vergrößern kann, das verlegt das Problem aber nur zeitlich)
Im Idealfall würde ich erreichen wollen, das wenn der "Alles löschen" Button gedrückt wird, der Heap Space wieder auf einen Anfangswert zurück springt.
Dazu habe ich versucht die ganzen Arrays und Vektoren global zu deklarieren und
Java:
Beispielarray= Null;
Java:
System.gc;
Dies hat schon ein bisschen was gebracht. Allerdings bleiben nunmehr von einem "Alles löschen" zum nächsten "Alles löschen" ~20MB im Speicher. (Vorher waren es ~60MB)
Ich habe bisher verschiedene Sachen ausprobiert z.B. Klassen, Funktionen mit private, public, final zu deklarieren das hat zu Veränderungen im Speicher geführt, wobei ich nicht eindeutig sagen kann, ob grundsätzlich gut oder nicht.
Wie sieht es mit dem deklarieren von Variablen aus?
Besser alles global, oder in Subclasses aufrufen ?
So wie ich das nach einlesen in das Thema verstanden habe, bestehen bei mir noch Referenzen auf Objekte. Deswegen werden diese nicht gelöscht. Wie vermeide ich das. (meine panels werden removed, die Arrays = Null gesetzt, SeriesCollection mit remove entfernt, der GC aufgerufen, das Panel geupdatet)
Auf was sollte ich grundsätzlich beim programmieren achten um meinen Speicher nicht zuzumüllen?
Lieber Objekte in Methoden erstellen oder Global?
Private Public oder Final benutzen ?
Gibt es eine Möglichkeit zu sehen, welche Objekte sich noch in meinem Heap befinden ?
Warum kommt es manchmal dazu, das mein GC nach Aufruf z.B. 20MB frei räumt und dann ohne das sich der Speicher in der Zwischenzeit verändert hat, nach erneutem Aufruf nochmal 10 MB entfernt werden.
An alle die mir Helfen ein großes THX.