Hallo!
Hallo!
Ist es zu empfehlen, wenn man mit großen Daten seis String oder Images arbeitet, System.gc() aufzurufen? Wenn ja wie und wo sollte man ihn am besten implementieren?
Eigentlich sollte man System.gc()-Aufrufe vermeiden. Wie NomadSould schon richtig sagte, wird bei einem System.gc() Aufruf nicht notwendigerweise
ein GC ausgefuehrt. Der GC bekommt nur einen Hinweis, dass er an der naechsten Moeglichen Gelegenheit laufen soll.
2. Frage zu Speicherverbrauch:
JLabel label = new JLabel();
label = null;
label = new JLabel();
Wird der GC den Speicher für das zuerst erstellte Objekt freigeben, weil keine Referenz darauf besteht, oder bleibt dieser weiterhin bestehen?
Ob die erste JLabel-Instanz direkt vom GC freigegeben wird haengt u.a. davon ab, wie der Heap-Speicher derzeit ausgelastet ist.
Ist dieser schon stark beansprucht, ist die Wahrscheinlichkeit hoeher, dass ein GC durchgefuehrt und die Instanz vom Heap entfernt wird.
3. Frage zu Speicherverbrauch:
Was sind die häufigsten Fehler bei String und Image Operationen die den Speicher voll laufen lassen? Was wird oft vergessen?
Welche Maßnahmen kennt ihr den Speicherverbrauch zu minimieren?
Die haeufigsten Fehler bei der Arbeit mit Objekten ist der, dass grosse Objekte
(grosse Strings, grosse Bilder) ueber "harte" Referenzen laenger im Speicher behalten
werden, als eigentlich notwendig. Ein weiterer haeufiger Fehler bei Swing oder allgemein
GUI Anwendungen ist der, dass EventListener bei verschiedenen Widgets registriert,
aber spaeter nicht mehr deregistriert werden, was das aufsammeln dieser durch den GC verhindert.
Was ist mit JMX, wäre sie hierfür hilfreich:
4. Könnte man mit Hilfe von JMX ausfindig machen, welcher String, welches Image Objekt genau wieviel Speicher verbraucht, um genau die ineffiziente Stelle im Programm zu finden, um sie zu verbessern. Es würde auch reichen speicherfressende, belastende Objekte herauszufinden, um diese ressourcenschonender zu implementieren.
Das kannst du mit Standard JMX AFAIK nicht... dafuer musst du schon einen Profiler bemuehen der ueber das JVM TI (Tool Interface)
in den Innereinen der JVM nachschaut.
Gruss Tom