Speicherlecks?

Ich schreibe gerade an einem Programm für ein Unternehmen zum Verwalten von Medien in Java. Aber mittlerweile braucht das Programm bereits nach dem Start ~80 MB Arbeitsspeicher oO
Programmiere ich so schlecht, oder schlampt Java? Damit der Speicherverbrauch bei der Benutzung des Programmmes nicht ins unendliche ausläuft, rufe ich an bestimmter Stelle System.gc() auf, was allerdings nur bedingt hilfreich ist :frowning:

Ich verwende übrigens Swing für die grafische Oberfläche.

Das ist nicht unbedingt ein Grund zur Besorgnis. Wenn genug Speicherplatz verfügbar ist, dann mag die JVM vorerst damit fortfahren, den Heap zu vergrössern anstatt das Ende eines Garbage Collection Zyklus abzuwarten.

Aha, heißt dass, solange genügend Arbeitsspeicher vorhanden ist wird nur geringfügig Speicher wieder freigegeben?

Btw.: Die Prozessorauslastung erhöht sich manchmal auch bis um 10%. Ist das normal für Java (Swing)?

Naja, wie die JVM im Einzelnen arbeitet, entzieht sich meiner Kenntnis.
Deine Zahlen sagen mir ebenfalls nicht besonders viel.
Ich würde aber sagen, dass eine Medienverwaltung von Natur aus mehr Speicher braucht
als allgemein üblich. Sicherlich hast du z.B. Collections mit grossen Bildern oder Ähnliches.
Vielleicht könntest du periodisch diese Collections “aufräumen”.
Wenn du nach “java memory leaks” (oder so ähnlich) googlest, findest du sich ein paar Tipps.

christoph du solltest auch darauf achten in wie weit du Objekte erzeugst und sie speicherst.
Lハdst du sie erst wenn sie gebraucht werden sparste Speicher

Wieso ist das ä so komisch bei "Lハdst "? :frowning:

weiss ich nicht irgendwas spinnt hier heute rum meine Umlaute gehen in Opera nicht so ganz

[QUOTE=EagleEye]christoph du solltest auch darauf achten in wie weit du Objekte erzeugst und sie speicherst.
Lハdst du sie erst wenn sie gebraucht werden sparste Speicher[/QUOTE]

Wie meinst du das? :confused:

Auch sehr sinnvoll, aber zumeist vergessen, das initialisieren von Objekten in einer Schleife nach außen verlagern, also:

for(Object obj : this.m_list) {
    MyObject myObj = new MyObject(obj);
    // ...
}
MyObject myObj;
for(Object obj : this.m_list) {
    myObj = new MyObject(obj);
    // ...
}

Ob mans glaubt oder nicht aber, gerade bei sehr großen Objekten, kann man so durchaus eine Performancesteigerung erreichen.

Gut Schuß
VuuRWerK :wink:

Sorry das ich jetzt erst antworte, hab gerade bisschen viel zu tun.

Na das du Objekte die zb nur kurz gebraucht werden nicht alsObjektvariablen machst sondern als lokale oder wenn sie nicht mehr benötigt werden auf null setzt bzw. sie aus Listen löschst. So dass niemand mehr Referenzen auf sie hat.
Das alles kann man auch gut mit einem Profiler überprüfen

Werd ich probieren, danke für die Tipps! :slight_smile: