Swing JDialog "flutet" den Arbeitsspeicher

Cromm Cruach

Mitglied
Hallo,

dieser Post bezieht sich ein Stück weit auf diesen Beitrag Auf beendingung des Formular warten

Das im Thema genannte Problem habe ich gelöst. Es werden nun alle Formulare nach einander angezeigt! Bisher habe ich diese Stapelverarbeitung im kleinen getestet habe gerade einen Test mit 145 Einträgen gestartet!

Hier nochmal der Code der die Fomulare anzeigt und am ender wieder zerstört!

Java:
public class OpenDialogSwingWorker extends SwingWorker<Void, Void>{

	FileAnalysis f = null;
	int i;
	
    public OpenDialogSwingWorker(FileAnalysis f, int i){
        this.f = f;
        this.i = i;
    }

    @Override
    public Void doInBackground() throws Exception {
		StringTokenizer t = new StringTokenizer(f.filenames.get(i), "[].", false);
		
		String quality = t.nextToken();
		String title = t.nextToken();
		title = title.substring(1);
		
		MovieDataForm mdf = new MovieDataForm(f, "Daten hinzufügen");
		MovieSearch ms = new MovieSearch(mdf);
		
		ms.searchPanel.searchField.setText(title);
		ms.searchPanel.searchButton.doClick();
		
		mdf.tabPane.fileInfoPanel.qualityCombo.setSelectedItem(quality);
		mdf.tabPane.fileInfoPanel.locationCombo.setSelectedItem(f.locationBox.getSelectedItem());
		mdf.tabPane.fileInfoPanel.sizeField.setText(f.size.get(i));
		mdf.tabPane.setSelectedComponent(mdf.tabPane.picturePanel);			
    	
    	return null;
    }
}

Am Ende der verarbeitung werden die Formulare mit
Code:
dispose();
"zerstört". Leider bleiben daten aus der Verarbeitung im Speicher und werden nicht vom GarbageCollectior vernichtet. Bei jeder Stapelverarbeitung wächst der Platz, der vom Programm im Arbeitsspeicher belegt wird um etwa 160.000 Kb, so dass nach wenigen einträgen 1,2 GB belegt sind.

in dem Formular werden unter anderem Bilder angezeigt. Dies geschieht in diesem Code Teil.

Java:
		pictureBox = new JRadioButton[cleanPictures.length];
		pictureLabel = new JLabel[cleanPictures.length];
		ImageIcon[] img = new ImageIcon[cleanPictures.length];
		
		for(int i = 0; i < cleanPictures.length; i++){
			
			img[i] = new ImageIcon(new URL(cleanPictures[i][1]));
			img[i].setImage(img[i].getImage().getScaledInstance(140, 210, Image.SCALE_DEFAULT));
			
			pictureLabel[i] = new JLabel(img[i]);
			pictureLabel[i].setSize(140, 210);
			
			
			pictureBox[i] = new JRadioButton();
			pictureBox[i].setSize(20, 20);
			pictureBg.add(pictureBox[i]);
			
			pictureListPanel.add(pictureLabel[i]);
			pictureListPanel.add(pictureBox[i]);
		}
		
		
	}

Die URLs stammen aus einem XML-Dokument das zu beginn im Formular eingelesen wird. Die Anzahl der Bilder die geladen werden sind von Eintrag zu Eintrag unterschiedlich (können schon mal 20 bilder sein). Und der wachsende Arbeitspeicher gängt im wesentlichen von der Bilderanzahl ab (soviel konnt ich herausfinden). Das Problem ist das die Bilder (sowie ich das sehe) nach beendigung des Formulars im Arbeitsspeicher bleiben.

Leider weis ich nicht warum. Müsste der GarbageCollector nicht merken das sie nicht mehr benötigt werden und den Platz wieder freigeben? Oder Übersehe ich hier etwas.

Danke im vorraus!

GRuß
 
C

Camino

Gast
Soweit ich weiss, entfernt der Garbage Collector nicht mehr benötigte Objekte nicht sofort, sondern wird irgendwann mal losgeschickt und schaut nach, was weg kann.
 

Ebenius

Top Contributor
Was das Speicherproblem angeht: Nimm doch mal einen Profiler (vielleicht Oracles VisualVM) und schau in Deine Anwendung herein, während sie läuft. Dann siehst Du wo Deine Objekte hängen.

Oder päckele mal den Quelltext Deiner gesamten Anwendung in ein ZIP/JAR und mach es verfügbar. Aus den Schnipseln lässt sich nicht herausfinden, wo die Daten hängen bleiben.

Grundsätzliche Anmerkung: Dein SwingWorker baut Swing-Elemente in [c]doInBackground()[/c] auf. Genau das sollte er nicht machen. Eigentlich müsstest Du die langlaufenden Arbeiten (die wahrscheinlich aus dem Konstruktor [c]MovieDataForm(FileAnalysis, String)[/c] aufgerufen werden) in [c]doInBackground()[/c] machen und dann alles was die GUI verändert in der Methode [c]done()[/c] des SwingWorkers.

Ebenius
 

bERt0r

Top Contributor
Das Problem stellt sich gar nicht, wenn du deiner MovieDataForm eine setData Funktion spendierst und dann einfach eine Instanz im Speicher hältst die du immer wieder mit neuen Daten bestückst anstatt jedes mal ein neues Objekt zu erzeugen.
 

Cromm Cruach

Mitglied
Laut dem Profiler wird der Speicher von String-Objekten gefüllt.

Aktuell sind alle meine Klassenvariablen public. Ich weis das das unprofessionell ist und bin auch dabei das zu ändern und mit gettern und settern zu arbeiten. Könnte das eine Ursache für das Speicherproblem sein?

Ansonsten nutzt meine Programm ne Menge DB-Abfragen. Wie sieht es das mit den ResultSets aus? Werden die iwann von selbst gelöscht oder muss man die iwie schließen oder so?!
 

Cromm Cruach

Mitglied
So ich habe meinen kompletten Code umgebaut! Alles so gemacht wie hier gefordert. Das Formular wird nun nicht mehrmals geladen sondern nur einmal und dann werde nur die Daten im Formular ersetzt.

Gebracht hat es nicht der Arbeitsspeicher wird immer noch geflutet und zwar sobald diese Funktion aufgerufen wird:

Java:
	public void setPicture() throws MalformedURLException{
		
		String[][] pictures = tmdbMl.getImage();
	
		window.tabPane.picturePanel.pictureListPanel.removeAll();
		window.tabPane.picturePanel.pictureListPanel.setLayout(new GridLayout(0,4,10,10));
		
		splashScreen.setDetailLabel("Importiere Bilddaten ...");
		
		Vector<String> url = new Vector<String>();
		for(int i = 0; i< pictures.length;i++){
			if(pictures[i][0]!= null){
				url.add(pictures[i][1]);
			}
		}
			
		window.tabPane.picturePanel.pictureBox = new JRadioButton[url.size()];
		window.tabPane.picturePanel.pictureLabel = new JLabel[url.size()];
		ImageIcon[] img = new ImageIcon[url.size()];
		
		splashScreen.setProgressBarMaximum(url.size());
		splashScreen.setProgressBar(0);
		
		for(int i = 0; i < url.size(); i++){
			
			img[i] = new ImageIcon(new URL(url.get(i)));
			img[i].setImage(img[i].getImage().getScaledInstance(140, 210, Image.SCALE_DEFAULT));
			
			window.tabPane.picturePanel.pictureLabel[i] = new JLabel(img[i]);
			window.tabPane.picturePanel.pictureLabel[i].setSize(140, 210);
			
			
			window.tabPane.picturePanel.pictureBox[i] = new JRadioButton();
			window.tabPane.picturePanel.pictureBox[i].setSize(20, 20);
			window.tabPane.picturePanel.pictureBg.add(window.tabPane.picturePanel.pictureBox[i]);
			
			window.tabPane.picturePanel.pictureListPanel.add(window.tabPane.picturePanel.pictureLabel[i]);
			window.tabPane.picturePanel.pictureListPanel.add(window.tabPane.picturePanel.pictureBox[i]);
			
			splashScreen.setProgressBar(splashScreen.getProgressBar()+1);
		}
		
    	window.tabPane.picturePanel.pictureScrollPane.getViewport().setView(window.tabPane.picturePanel.pictureListPanel);

Ich bin mir nun zu 100% sicher, das es die Bilder sind. genau dann wenn sie geladen werden steigt der Speicherbedarf. und nach dem Schließen des Formulars werden sie nicht mehr aus Arbeitsspeicher genommen. Ich hab einfach keine ahnung wo der Fehler liegen soll.
 

bERt0r

Top Contributor
Warum hast du ein String[][] mit dem namen pictures? Du speicherst doch nicht die Pixeldaten als Strings, oder?
 

Ebenius

Top Contributor
Bzgl. DB-Abfragen: Danach einfach immer in dieser Reihenfolge aufräumen:
  1. Code:
    ResultSet.close()
  2. Code:
    Statement.close()
  3. [c]Connection.close()[/c] (sofern die selbe Connection nicht nachgenutzt wird)

Je nach Treiber-Implementation ist 1. zwingend erforderlich oder wird implizit bei 2. mit gemacht. Besser man macht's immer selbst.

Ebenius
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JDialog mit count down timer AWT, Swing, JavaFX & SWT 1
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
L Swing JDialog ton beim klicken ausstellen AWT, Swing, JavaFX & SWT 1
L JDialog hat manchmal keinen Inhalt AWT, Swing, JavaFX & SWT 2
Drachenbauer Hauptfenster erhält schmale Streifen rechts unt unten, wenn ich einen JDialog hinzufüge. AWT, Swing, JavaFX & SWT 19
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
B Eingaben im JDialog abwarten AWT, Swing, JavaFX & SWT 4
S Swing JDialog mit KeyEvent als Rückgabe AWT, Swing, JavaFX & SWT 1
O Swing JDialog öffnen und dann warten bis er geschlossen wurde AWT, Swing, JavaFX & SWT 2
stylegangsta JDialog bestimmte Zeilen kursiv AWT, Swing, JavaFX & SWT 20
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
Bluedaishi JDialog modal und JTextArea AWT, Swing, JavaFX & SWT 4
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
T Event Handling JDialog schließen, sobald ein neuer erzeugt wird AWT, Swing, JavaFX & SWT 3
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
D Button auf geöffnetem JDialog AWT, Swing, JavaFX & SWT 5
N Definitionen JDialog AWT, Swing, JavaFX & SWT 7
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
D Swing Schließen von JDialog soll auch JFrame schließen. AWT, Swing, JavaFX & SWT 4
N Swing Fragen zu non-modal JDialog AWT, Swing, JavaFX & SWT 1
F Swing JDialog schließen - WindowListener bekommt dispose nicht mit AWT, Swing, JavaFX & SWT 0
N JDialog als Progress-Anzeige AWT, Swing, JavaFX & SWT 6
M JDialog statt JFrame AWT, Swing, JavaFX & SWT 22
I focus an ein jdialog geben AWT, Swing, JavaFX & SWT 3
3 JDialog über einem Vollbildfenster anzeigen AWT, Swing, JavaFX & SWT 5
M JDialog soll JFrame "blockieren" AWT, Swing, JavaFX & SWT 2
K JDialog zeigt Components nicht an AWT, Swing, JavaFX & SWT 3
S Jframe aus JDialog starten AWT, Swing, JavaFX & SWT 4
M JDialog übergibt eingaben nicht an aufrufende klasse AWT, Swing, JavaFX & SWT 15
S Assistent im JDialog AWT, Swing, JavaFX & SWT 7
H Swing JDialog cannot be resolved as a typ AWT, Swing, JavaFX & SWT 12
S Swing Eigenen JDialog mit Rückgabewert AWT, Swing, JavaFX & SWT 3
C Swing JDialog Ladebildschirm wird nicht angezeit AWT, Swing, JavaFX & SWT 5
Jagson Mit JMenu auf jDialog zurück? Wie? AWT, Swing, JavaFX & SWT 8
A JDialog (modal) blockiert alle Fenster! AWT, Swing, JavaFX & SWT 2
Jagson Swing Von JDialog zu anderem JDialog wechseln AWT, Swing, JavaFX & SWT 2
S JDialog direkt über dem MainFrame aufpoppen lassen AWT, Swing, JavaFX & SWT 2
A Swing JDialog KeyBindings und Textfelder AWT, Swing, JavaFX & SWT 5
D Daten von JDialog an JTable in JFrame übergeben AWT, Swing, JavaFX & SWT 7
D JDialog: immer nur einer gleichzeitig AWT, Swing, JavaFX & SWT 4
S JDialog per Button schließen AWT, Swing, JavaFX & SWT 2
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
D JDialog alwaysOnTop, aber nur innerhalb der Applikation AWT, Swing, JavaFX & SWT 3
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
S JDialog über Applet AWT, Swing, JavaFX & SWT 3
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
J Swing JDialog gleichzeitig mit JFrame anzeigen AWT, Swing, JavaFX & SWT 8
S Probleme jDialog einfügen AWT, Swing, JavaFX & SWT 4
qwerqer Swing JDialog Darstellungsprobleme - Dialog lässt sich nicht schließen AWT, Swing, JavaFX & SWT 3
S Schrift ändern in JDialog AWT, Swing, JavaFX & SWT 3
S Problem mit JDialog AWT, Swing, JavaFX & SWT 3
D Elternfenster vom JDialog aktualisieren oder nicht ? AWT, Swing, JavaFX & SWT 7
hdi Swing Genaue Funktionsweise von modalem JDialog? AWT, Swing, JavaFX & SWT 11
U JDialog ohne Taskleiste AWT, Swing, JavaFX & SWT 7
S Programm pausieren während JDialog offen ist AWT, Swing, JavaFX & SWT 2
X JEditorPane Größe in JDialog automatisch anpassen AWT, Swing, JavaFX & SWT 2
Ollek JDialog Koponenten neu anordnen AWT, Swing, JavaFX & SWT 3
A JDialog AWT, Swing, JavaFX & SWT 10
Dit_ SwingUtilities.invokeLater und Modaler JDialog AWT, Swing, JavaFX & SWT 11
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A JDialog ausdrucken AWT, Swing, JavaFX & SWT 7
aze JDialog mit runden ecken AWT, Swing, JavaFX & SWT 8
Dit_ JDialog nur horizontal vergrößern AWT, Swing, JavaFX & SWT 3
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
M Swing Vererbung, Probleme mit JDialog AWT, Swing, JavaFX & SWT 12
H JDialog, Modal - Klassenübergreifend => Problem AWT, Swing, JavaFX & SWT 5
S Swing Bild (Gif) in Bitte warten JDialog AWT, Swing, JavaFX & SWT 6
U JFrame minimiert nach JDialog, JOptionPane AWT, Swing, JavaFX & SWT 3
K Swing JDialog aus Frame ausrufen AWT, Swing, JavaFX & SWT 2
B JDialog über JFileChooser anzeigen AWT, Swing, JavaFX & SWT 6
B JDialog AWT, Swing, JavaFX & SWT 6
J Swing Probmel mit JDialog (Modal/FocusLost/Button) AWT, Swing, JavaFX & SWT 5
E Swing Fehlerhaftes Verhalten bei gleichzeitigen Verwendnen von PopUpMenu und JDialog?! AWT, Swing, JavaFX & SWT 5
J Swing JDialog mit static-Funktion anzeigen -> Rückgabewert AWT, Swing, JavaFX & SWT 3
E Daten von JDialog nach JFrame übertragen AWT, Swing, JavaFX & SWT 4
F ActionListener von JButton funktioniert mit JFrame aber nicht mit JDialog AWT, Swing, JavaFX & SWT 2
D Mehrere Comboboxen in JDialog AWT, Swing, JavaFX & SWT 2
F JDialog per Button schliessen - klappt nicht AWT, Swing, JavaFX & SWT 4
BattleMaster246 JDialog erscheint in der Taskbar AWT, Swing, JavaFX & SWT 7
H Sub-Dialog von modalem JDialog aus aufrufen - geht das? AWT, Swing, JavaFX & SWT 6
R Swing JDialog liefert immer false, 2 JListen verknüpfen AWT, Swing, JavaFX & SWT 3
P Swing eigenen Modalen JDialog AWT, Swing, JavaFX & SWT 6
J JDialog verliert Werte AWT, Swing, JavaFX & SWT 3
N Variablen an JDialog übergeben AWT, Swing, JavaFX & SWT 2
P Swing JDialog schliesst nicht AWT, Swing, JavaFX & SWT 2
X Swing JDialog von JInternalFrames überlappen lassen AWT, Swing, JavaFX & SWT 2
O JDialog-JScrollPane-JTable Problem AWT, Swing, JavaFX & SWT 3
N Swing Frage zu modalem JDialog. AWT, Swing, JavaFX & SWT 16
A JFrame oder JDialog AWT, Swing, JavaFX & SWT 12
B Swing JDialog : Herausfinden wie dieser beendet wurde? AWT, Swing, JavaFX & SWT 2
T JDialog ohne Fenstermanager? AWT, Swing, JavaFX & SWT 2
S JDialog in der Taskbar anzeigen AWT, Swing, JavaFX & SWT 3
A Swing JFrame Werte aus JDialog übergeben AWT, Swing, JavaFX & SWT 4
K Swing JDialog ohne Titlebar mit Rahmen AWT, Swing, JavaFX & SWT 5
KrokoDiehl Swing KeyEvents für JDialog / JFrame AWT, Swing, JavaFX & SWT 2
C Swing JComboBox in JDialog AWT, Swing, JavaFX & SWT 3
F Frage zu Dialogen mit JDialog -Erstellung des Konstruktors AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben