Speicherverwaltungsbug bei java6 bei Swing/AWT?

Status
Nicht offen für weitere Antworten.
J

Jan_HH

Gast
Hallo,

bei meinem Programm werden (aus was für Gründen auch immer) diverse Swing-Fenster (JFrame) nacheinander dargestellt. Ein Fenster wird angezeigt, nach Klick auf einen Button verschwindet es, und das nächste wird angezeigt. Die Fenster an sich (also die JFrame-Objekte) sind allesamt bereits erzeugt worden, bevor das erste Fenster angezeigt wird (es werden also während des Ablaufs KEINE neuen Objekte erstellt).

Bei java bis einschliesslich 5/1.5 hat alles funktionert, aber ab java 6 verhält es sich nun so, dass ein Fenster beim Anzaigen ca. 3 MB Speicher verbraucht (erkennbar im Windows-Taskmanager), die nicht wieder freigegeben werden, wenn das nächste Fenster an der Reihe ist. Der Speicher wird also nach und nach immer knapper, vollgemüllt mit was auch immer. Da sich java bis einschliesslich Version 5 nicht so verhalten hat (da blieb der Speicherbedarf der Anwendung die ganze Zeit über konstant), liegt die Vermutung nahe, dass es sich um einen Bug bei java 6 handelt. Da dieser aber auch in der allerneuesten Version (update 5) noch vorhanden ist, kann es ja auch sein, dass es doch kein Bug ist, sondern eine geändert Verhaltensweise von java. Was ziemlich mies wäre, weil es quasi das aus für mein Programm bedeuten würde.

Hat irgendjemand Ahnung davon, oder ist dieser Effekt schonmal jemandem begegnet?

Gruß
Jan
 

Janus

Bekanntes Mitglied
einen bug in java6 zu vermuten ist sehr gewagt. ausschließen will ich das nicht, aber ich vermute eher ein problem in deinem code ;) entweder ein simples memory leak (z.b. werden die referenzen auf bereits geschlossene fenster noch vorgehalten), das in java5 nicht aufgefallen ist oder, noch viel einfacher, der GC hat plötzlich schlechtere laune.

java garantiert nicht, dass speicher sofort wieder freigeräumt wird. nen erster hinweis, ob nen memory leak vorliegt oder der GC lahmt ist, wenn der heap space vollläuft und die jvm aussteigt. dann hat in 95% der fälle auch der GC nichts mehr retten können.
 

Marco13

Top Contributor
Mit fenster.dispose() sollte der Speicher wieder freigegeben werden. Das heißt aber NICHT, dass der TaskManager sofort weniger Speicher anzeigt. Der Speicher, der "freigegeben" wurde, ist immeroch für die JVM reserviert. Etwas unpäzise(!) formuliert: Der Speicher wird erst "echt" freigegeben, wenn neuer Speicher angefordert wird, und der verfügbare Speicher nicht ausreicht. Man könnte (auch wieder etwas unpräzise) sagen, dass ein "Fehler" nur dann vorliegt, wenn irgendwann ein OutOfMemoryError kommt - wenn der nicht kommt, ist alles in Ordnung.
 
J

Jan_HH

Gast
Genau der kam aber.. das ist ja das Problem. Pro Fenster ca. 3 MB mehr, bis irgendwann Speicher voll. Den Exceptions nach, die da kamen, klang es so, als ob ein Bitmap-Objekt zum Zeichnen des Fensterinhalts erzeugt und später nicht wieder freigegeben wird.. kann das sein? Aber wie gesagt, in java < 6 trat nichts derartiges auf. Natürlich gibt es noch Referenzen auf die Fenster, ihr Inhalt wird ja später noch benötigt.. aber die Fenster-Objekte werden eh alle schon im Vorfeld erzeugt, sie werden später lediglich angezeigt und wieder ausgeblendet. Und es kann doch wirklich nicht sein, dass eine Applikation, die 100 Fenster benötigt, so viel Speicher verbrät, dass das Programm mit einer Exception abstürzt!? Selbst wenn das kein Bug sein sollte, ist es zumindest höchst unsinniges Design. Kann mir wirklich nicht vorstellen dass es sich so verhalten soll.
 

Wildcard

Top Contributor
Jan_HH hat gesagt.:
Und es kann doch wirklich nicht sein, dass eine Applikation, die 100 Fenster benötigt, so viel Speicher verbrät, dass das Programm mit einer Exception abstürzt!?
Wenn sie nicht wieder freigegeben werden: natürlich.
Wo soll der Speicher denn herkommen? Es handelt sich um eine begrenzte Resource.
 
G

Guest

Gast
Dann hätte der Fehler aber auch schon mit java < 6 auftreten müssen,oder?
 

Wildcard

Top Contributor
Nein, auch mit Java 5 gab es keine unbegrenzten Resourcen.
Welches Verhalten erwartest du wenn du immer mehr und mehr auf den Heap packst?
 

Illuvatar

Top Contributor
Wildcard... die Resourcen wurden anscheinend vor Java 6 nach dem Schließen freigegeben, jetzt nicht mehr. Hat der OP doch geschrieben, und wieso sollte er das erfinden?

@OP Verwendest du sicher den gleichen Code mit beiden Versionen? Rufst du dispose() auf um die Fenster zu Schließen? Sonst fällt mir nämlich leider auch nix ein.
 

Wildcard

Top Contributor
Illuvatar hat gesagt.:
Wildcard... die Resourcen wurden anscheinend vor Java 6 nach dem Schließen freigegeben, jetzt nicht mehr. Hat der OP doch geschrieben, und wieso sollte er das erfinden?
Natürlich gibt es noch Referenzen auf die Fenster, ihr Inhalt wird ja später noch benötigt..
Das sie dann nicht komplett freigegeben werden können, ist doch klar.
 
J

Jan_HH

Gast
Verwirrung.. aaalso.. ein Aufruf von dispose() löst das Problem in der Tat. Vielen Dank!

Das Problem tritt NUR bei java 6 auf, bei 1.4 und 1.5 nicht (mit natürlich genau dem gleichen Programmcode).

Ich packe auch NICHT immer mehr Objekte auf den heap.. ich erzeuge n Fenster, und zeige eins nach dem anderen an. Ich erzeuge sie nicht direkt vor dem Anzeigen, sondern schon vorher alle auf einmal. Dabei wird natürlich eine bestimmte Menge Speicher verbraucht, aber die bleibt danach dann auch mehr oder weniger konstant.

Es ist wohl also kein Bug, aber schon sowas wie "inkonsistentes Verhalten". Ich vermute, dass java-intern die ganze Fensterdarstellung kompett ungebaut wurde, und mittlerweile braucht ein AWT-Fenster halt irgendein 3 MB grosses Objekt, um sich zeichnen zu können (würde ja auch passen, BildschirmbreitxBildschirmhöhex24 bit Farben = ca. 3 MB), und das war bei java 5 noch nicht so. Der eigentliche Bug dürfte in meinem Programm sein, das dispose() vergessen zu haben.
 
W

Wowan

Gast
Hi,

ich habe das gleiche Problem. Habe eine Datanbank im Hintergrzud laufen und hole meine Datan aus ihr. Das jeweillige Jcomponent beobachtet (Observer) die Datenbank-Anweisungs- Klassen. Sobald eine Anweisung ausgeführt worden ist, meldet die der entsprechnder Klasse aus dem Frontend (die von JComponent abgeletet is) das Egebnis. Darauf hin werden in diesem jComponen neue Componenten (Jpanel, Jtextfield.. ect. ) gesetzt oder ersetzt. Beispielsweise jabe ich eine JTable, sobald Daten den von den Datenbank-Anweisungs- Methoden mit notifyobserver dem zugeförigen angemeldeten observer übermittelt werden, wird eine neue Jtable (mit diesen daten Gefüllt). Dazu überschreibe ich einfach die alte Jtabel. Das Problem ist, dass die alten Daten der Jtabel immer noch im speicher bleiben und die neuen den Speicher füllen.

Wenn ich die Anweisung 50 mal ausführe, bewirkt dies den Überlauf des Heaps. Dispose() kann ich nicht ausführen, da ich nur mit einem Jframe arbeite..... alle anderen Klassen leite ich von JComponent ab (setzte den Lyoutmanager ect. ).

Könnt ihr mir weiter helfen?
 

tfa

Top Contributor
Wenn du die alten Daten nie weg wirfst, wird natürlich der Speicher überlaufen. Wieso legst du überhaupt immer neue JTables an? Benutze ein TableModel, dem du die Daten aus der DB übergibst. Wenn es keine Referenzen auf die alten Objekte gibt, sollte das Problem nicht mehr auftreten.
 
G

Guest

Gast
tfa hat gesagt.:
Wenn du die alten Daten nie weg wirfst, wird natürlich der Speicher überlaufen. Wieso legst du überhaupt immer neue JTables an? Benutze ein TableModel, dem du die Daten aus der DB übergibst. Wenn es keine Referenzen auf die alten Objekte gibt, sollte das Problem nicht mehr auftreten.


Hey Tfa, ich hab das Problem gefunden. Meine klasse waren noch in den Observer angemeldet. Ich habe die dann mittels deleteObserver(klasse) gelöscht. :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
S If(JRE>=Java6) {nutze JAVA6 API} else {nicht} AWT, Swing, JavaFX & SWT 6
F Java6 GroupLayout Frage zu addGap() AWT, Swing, JavaFX & SWT 4
XWing Jave swing overly benutzten. AWT, Swing, JavaFX & SWT 3
J Anzeige ID und Markierung für Knoten in Eclipse & Swing AWT, Swing, JavaFX & SWT 4
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen


Oben