Speicherverwaltung bzw. Speicher wieder frei geben?!

ElJarno

Mitglied
Hi Leute,
eigentlich sollte es dieses Thema in Java wegen GC nicht geben. Trotzdem hab ich in meinem Programm doch argen Ressourcenverbrauch, welcher auch nicht wieder durch den GC freigegeben wird. Es ist so, ich lade Unterprogramme(JPanel) in ein JTabbedpane. Über einen integrierten Schließbutton wie Firefox/IE kann man den Tab wieder schließen. Die Panels hängen auch einzig allein in dem Tab und werden nirgendswo sonst referenziert.
Problem ist nun dass man nach zirka 30 verschiedenen Tabs ungefär 200 MB Arbeitsspeicher besetzt. Schließe ich nun die Tabs bleibt trotzdem 200 MB besetzt, dieses Spielchen zieht sich bis zirka 310 MB fort. Ab da an reagiert der GC, das Programm ist dann aber sehr träge. Gibt es ne möglichkeit den Speicher schon vorher wieder frei zu bekommen bzw. kennt ihr vlt. ein Plugin zur Analyse für Eclipse.

Gruß Jan
 
Hallo,

du könntest vielleicht mal folgendes versuchen.

Anstatt dass du immer mit new einen neuen JPanel erstellst (kurzlebiges Object) der nach der Verwendung von JPanel wieder durch den GC freigegeben werden müsste, könntest du ja auch von Beginn an mehre JPanels in den Speicherladen und immer einen freien bei bedarf anzeigen (ggfs. neu initialisieren bzw. reseten.

Du würdest sozusagen deine JPanels recyclen.

Du kannst ja zu beginn soviele JPanels erstellen, wie du den maximal Wert erwartest z. B. 8 oder 16. Im Schlimmsten Fall musst du dir bei Bedarf neuen Speicher beschaffen. Du könntest die JPanels ja in einer möglichst statischen (also lieber Array List anstelle von Linked List) Collection speichern.

Selbst wenn du jetzt im modernen JAVA programmierst, kannst du ja trotzdem das ältere Prinzip aus den C-Zeiten verwenden, in der man den Speicher immer möglichst statisch reserviert hat und dieses dynamische gedöns mit malloc vermieden hat. Das ist nämlich von Grund auf Böse :)
 
Zuletzt bearbeitet:
Hast du dein Programm mal mit der JConsole analysiert (oder anderen Speicheranalyse-Tools)?

Oder hast du deinem Programm zu viel Speicher gegeben und der GC muss dann viel aufräumen? (vlt ein Stop the world GC sogar?)
 
Hast du dein Programm mal mit der JConsole analysiert (oder anderen Speicheranalyse-Tools)?

Oder hast du deinem Programm zu viel Speicher gegeben und der GC muss dann viel aufräumen? (vlt ein Stop the world GC sogar?)

Ne hab ich noch nicht analysiert. Und wie kann ich denn einem Programm explizit Speicher zuweisen, das ist doch in der VM eingestellt oder nicht. Zumindest laufen alle anderen Java Anwendungen recht normal, z.B. Eclipse ;-).
 
Wenn du deinem Java-Programm nichts angibst werden die Standard-Einstellungen zum Speicher der VM verwendet.

Der Standard-Heap-Size ist bei einer Sun(Oracle) VM 64MB (32bit) oder 30% mehr bei 64bit.

Bei eclipse ist der Standard-Speicher bereits erhöht worden. (eclipse.ini)

JConsole ist ein Standard-Programm, welches in der Sun-JDK enthalten ist. JVisualVM ist auch nicht zu verachten :)
 
Jut soweit, alles kla. Nun ja aber im Prinzip handelt es sich um ein noch recht Simples Programm und jetzt schon an der Heap Size rumzubastelt halte ich für zu früh, deswegen wollte ich erst mal gucken ob ich das Problem nicht so in Griff bekomme. Vor allendingen wenn die Heap-Size auf 64 MB beschränkt ist, wieso klettert dieser bis auf zirka 320 MB und wieso springt erst dann der GC richtig ein?
 
Ganz einfach, weil die JVM auch einen großen Speicher-Overhead mitbringt.

Eine andere Frage, benutzt du ein JRE oder ein JDK? Hast du ein 64bit OS oder Linux?

Der Hintegrund der Frage ist, dass es 2 verschiedene Modis der VM gibt. Nämlich client und server. Und je nach Architektur und OS wird eins Standardmässig gewählt.

Vielleicht hilft dir ein -client als VM-Argument.
 
Also System ist XP 32 Bit ein JDK glaub ich zu benutzen, wie sollte ich sonst Entwickeln können oder kann man auch irgendwo das JRE als VM starter einstellen?
 
Hallo,

ich glaube euer Lösungsansatz ist falsch. Die Einstellungen der JVM sind nicht das Problem. Ist wohl auch egal welches OS installiert ist.

Das Problem ist ja dass zur Laufzeit der Anwendung zu oft Speicher angefordert wird, der aber nur kurz gebraucht wird (kurzlebiges Objekt). Man sollte eher versuchen den angeforderten Speicher wiederzuverwenden, damit man über die Laufzeit weniger Speicher mit 'new' anfordern muss. Denn das freigeben von Speicher durch den GC kostet Performance ...

Vielleicht könntest du ja mal beschreiben, was das für Unterprogramme sind, die du verwendest.

Gruß

Tikonteroga
 

Neue Beiträge

Zurück