Was frisst in meinem Programm den Speicher / verschlechtert die Performance

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hi,
ich hab grad ein seltsames Problem mit meiner GUI. Hin und wieder passiert es, dass es zu ruckeln anfängt, zB wenn ich schnell ein paar Zeilen in meinem Table markiere (gedrückte Maustaste und drüberlaufen), dann hängt das manchmal stark hinterher.

Ich hab auch ne Funktion im Programm die mir den belegten Speicher anzeigt. Anfangs sind es immer 4,9 MB, aber dann wird daraus 6...12.. und ab 8 fängt es schon zu ruckeln an. Über 12 MB hab ich's bisher nicht bekommen, manchmal sinkt das auch wieder.

Nun durch Rumprobieren komm ich nicht dahinter.

Was ist ein einsteigerfreundliches Tool um herauszufinden welche Objekte denn den Speicher belegen, und vllt wann es größere Sprünge gibt, eben von 5 auf 12 MB zB.
Wenn's geht kein superkomplexes Megatool, sondern etwas "leichteres", denn ich hab mit sowas noch nie gearbeitet.

Vielen Dank!
 
Danke, werd's mir mal ansehen. Mal kucken ob ich damit zurecht komme, ansonsten populiere ich weiterhin diesen Thread 😉
 
Hm okay, also es scheint so zu sein: Sobald ich auf einen gewissen Button drücke, springt der Speicher um ca 3 MB nach oben. Beim Drücken auf den Button wird ein JDialog erstellt. Sehr simpel, ohne Inhalt, einfach nur ein leerer JDialog.

Ich glaube eher mein Problem ist nicht, dass das 3MB braucht, sondern das aus irgendeinem Grund mein Table lahm wird sobald mehr als ca 6-7 MB im Heap sind, kann das sein? Ich meine das ist ja keine große Zahl, oder?

... hat spontan jemand eine Idee? Ist das normal, dass JTables beim Rumpfuschen mit der Maus (also sehr schnelle Selektionswechsel der Zeilen) ruckeln, wenn der Heapspace größer als 6 MB ist ^^ Solange der ca 4 MB ist macht das nämlich keine Probleme...
 
Zugegeben, ich kenne die Konzepte hinter Swing nicht (und auch nicht die Anforderungen an deine Implementierung), aber 6 MB (und auch schon 4 MB) klingen nach viel, sehr viel sogar.

Ark
 
Also ich hab allein für die GUI-Symbole ca 30 png's geladen, und dann noch ca 200*100 px große JPEG bilder.. aber nur 5 stück oder so (wobei das Programm auch auf mehere hundert ausgelegt sein soll). Hm was kann's noch sein.. Hab halt recht viele Komponenten in der GUI, kA ob 5 MB normal sind.

edit: Hab grad nachgeprüft, die Bilder alle zusammen sind nur 100 kb, zumindest auf der Festplatte
 
edit: Hab grad nachgeprüft, die Bilder alle zusammen sind nur 100 kb, zumindest auf der Festplatte

DAS hat nun nichts zu sagen: In einem BufferedImage (oder ähnlichem) wird jeder Pixel (RGB(A)) als ein int gespeichert - also in 4 bytes, und bei 5 Bildern mit 100x200 macht das allein 400KB aus. Übrigens sind 5 MB IMHO nicht viel - es werden ja schon etliche Klassen geladen und so... also, das sollte IMHO kein Problem sein. Die obligatorische Frage 😉 : Kannst du ein KSKB posten, wo das Problem auftritt?
Genauere Informationen über Objektallokationen liefert der Eclipse TPTP, aber eigentlich müßte man schon aus der VisualVM oder einem Kommandozeilen-Dump mehr Informationen rausziehen können...
 
Das Thema hat sich erledigt. Ich weiss nicht genau woran es lag, könnte drüber nachdenken aber hab grad keine Lust. Fakt ist ich hab da ziemlich unperformanten Code geschrieben irgendwo. Wegen eines anderen Problems - bzw. dessen Lösung - ist es jetzt aber auch nicht mehr möglich so viele Selektionen in so kurzem Zeitraum zu machen, von daher tritt das nicht mehr auf.

PS: Ich hab jetzt stellenweise ca 20 MB im Heap liegen, aber es läuft prima. Also es war echt mein Fehler, und die Speichergröße scheint normal zu sein wenn man einige Images zur Laufzeit hat.
 
Kleine Anmerldung am Rande:

Hatte mal in ner Anwendung ne JTable mit 4 oder 5 Spalten und ca. 16.000 Zeilen. Da war Multiselection oder das anwenden eines Filters überhaupt kein Problem.

- Alex
 
Du kannst dir ja auch gar nicht ganz sicher sein, dass wenn 5 MB Speicher für die JVM reserviert werden, dass die dann auch alle sofort gebraucht werden. Kann ja auch sein, dass automatisch ab gewissen Grenzen etwas mehr vom Betriebssystem gebettelt wird, als zu dem zeitpunkt nötig um etwas Spielraum zu haben.
 
Es geht nicht um Multi oder Single Selection sondern darum mit gezogener Maustaste über den Table zu huschen und im SelectionListener auch auf valueIsAdjusting() zu reagieren. Also ca 50 mal pro Sekunde. Und pro Aufruf befülle ich ein JPanel mit Daten und einem Bild. Und irgendwo dort hab ich n Speicherleck. Aber da ich das jetzt eh deaktiviert hab lass ich das Leck mal lecken. Oder mich am Ar***. Also diesmal schieb ich die Schuld alleine mir in die Schuhe und nicht Swing lol 😀
 
Kann ja auch sein, dass automatisch ab gewissen Grenzen etwas mehr vom Betriebssystem gebettelt wird, als zu dem zeitpunkt nötig um etwas Spielraum zu haben.
Da hast du vollkommen Recht, das konnte ich mit dem Tool auch beobachten. Sobald der restliche freie Speicher auf einen gewissen Wert sinkt werden pauschal n paar MB (oder irgendein Prozentsatz) reserviert, auch wenn es noch nicht gebraucht wird.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben