Hallo zusammen,
ich arbeite an einer Software, in der Messungen durchführt werden.
Dazu gibt es diverse Diagramme und Datenstrukturen... wenn alles fertig ist, wird alles in ein File geschrieben und man kann die nächste Messung machen.
Nach Programmstart belegt das Programm ca. 50mb
Nach einer Messung sind es 65mb.
Mache ich nun viele Messungen, z.B. 10 nacheinander wächst der Speicher im Taskmanager auf ca 120mb und und teilweise "friert" dann das Programm dann irgendwann einfach ein. Keine Exception. Repaint funktiniert nicht und die Anwendung reagiert träge bis gar nicht.
Bei jedem Testneustart wird offensichtlich Speicher freigegeben (clear()-Methoden und Neurefernzierungen), er kommt aber nicht annähernd auf den Wert zurück, den das Programm vor/nach dem ersten Test hat.
Ich habe jetzt die Vermutung, dass ich irgendwo ein Speicherleck habe... aber wo?!
Wie suche ich hier?
Neue Objekte bei neuer Messung/während einer Messung werden hauptsächlich hier erzeugt:
- GUI: eigentlich kaum - initial alles erstellt und ins Layout eingefügt und entfernt
- Datenmodell: Einige Listen (ArrayList) mit Objekten - Das wird bei jeder neuen Messung ge-clear()-ed.
- Charts: Diverse JFreeCharts; diese Erzeuge ich, adde sie. Später clear() ich sie und remove() sie aus dem Layout. Dann wird ein neues erzeugt etc.
- Timer: Existieren sehr viele in dem Programm. Diese cancel() ich und erzeuge jeweils einen neuen, den ich starte. Kann man her mehr machen außer cancel()
Ansonsten fallen mir noch einige Observer-Listen ein. Hier bin ich aber ziemlich sicher, dass Objekte immer wieder passend aus den Observer-Listen entfernt werden.
Nun meine konkreten Fragen:
Was der oben genannten Punkte ist "ein Klassiker" bei Speicherlecks? Wo vermutet man das Problem?
Gibt es Strategien/Tools um herauszufinden wo die Speicherlecks ind bzw wofür der ganze Speicher benötigt wird?
Sollte ich den Garbage Collector explizit aufrufen? (mache ich nicht)
Kann ich das "Einfrieren" des Programms irgendwie verhindern/erkennen?
Und evtl eine ganz Dumme Frage zu dem Thema:
Was passiert bzw ist es falsch, wenn ich ein Member-Objekt = null setze bzw gleich neu zuweise (= new Object())?
Dann wird doch das alte Objekt durch den GarbageCollector aus dem Speicher genommen, weil es die einzige Referenz war, richtig?!
Ebenso, wenn ich GUI-Elemente erzeuge, einem Container add()e und mit remove() oder removeAll() entferne (und keine weitere Referenz besteht), oder?!
ich arbeite an einer Software, in der Messungen durchführt werden.
Dazu gibt es diverse Diagramme und Datenstrukturen... wenn alles fertig ist, wird alles in ein File geschrieben und man kann die nächste Messung machen.
Nach Programmstart belegt das Programm ca. 50mb
Nach einer Messung sind es 65mb.
Mache ich nun viele Messungen, z.B. 10 nacheinander wächst der Speicher im Taskmanager auf ca 120mb und und teilweise "friert" dann das Programm dann irgendwann einfach ein. Keine Exception. Repaint funktiniert nicht und die Anwendung reagiert träge bis gar nicht.
Bei jedem Testneustart wird offensichtlich Speicher freigegeben (clear()-Methoden und Neurefernzierungen), er kommt aber nicht annähernd auf den Wert zurück, den das Programm vor/nach dem ersten Test hat.
Ich habe jetzt die Vermutung, dass ich irgendwo ein Speicherleck habe... aber wo?!
Wie suche ich hier?
Neue Objekte bei neuer Messung/während einer Messung werden hauptsächlich hier erzeugt:
- GUI: eigentlich kaum - initial alles erstellt und ins Layout eingefügt und entfernt
- Datenmodell: Einige Listen (ArrayList) mit Objekten - Das wird bei jeder neuen Messung ge-clear()-ed.
- Charts: Diverse JFreeCharts; diese Erzeuge ich, adde sie. Später clear() ich sie und remove() sie aus dem Layout. Dann wird ein neues erzeugt etc.
- Timer: Existieren sehr viele in dem Programm. Diese cancel() ich und erzeuge jeweils einen neuen, den ich starte. Kann man her mehr machen außer cancel()
Ansonsten fallen mir noch einige Observer-Listen ein. Hier bin ich aber ziemlich sicher, dass Objekte immer wieder passend aus den Observer-Listen entfernt werden.
Nun meine konkreten Fragen:
Was der oben genannten Punkte ist "ein Klassiker" bei Speicherlecks? Wo vermutet man das Problem?
Gibt es Strategien/Tools um herauszufinden wo die Speicherlecks ind bzw wofür der ganze Speicher benötigt wird?
Sollte ich den Garbage Collector explizit aufrufen? (mache ich nicht)
Kann ich das "Einfrieren" des Programms irgendwie verhindern/erkennen?
Und evtl eine ganz Dumme Frage zu dem Thema:
Was passiert bzw ist es falsch, wenn ich ein Member-Objekt = null setze bzw gleich neu zuweise (= new Object())?
Dann wird doch das alte Objekt durch den GarbageCollector aus dem Speicher genommen, weil es die einzige Referenz war, richtig?!
Ebenso, wenn ich GUI-Elemente erzeuge, einem Container add()e und mit remove() oder removeAll() entferne (und keine weitere Referenz besteht), oder?!