Speicher Leak durch Tabellenaktualisierung

Diskutiere Speicher Leak durch Tabellenaktualisierung im AWT, Swing, JavaFX & SWT Bereich.
S

Selmau

Hallo Zusammen

Ich bin relativ unerfahren in Java und habe eine erste Anwendung Programmiert, bei der ich Daten in eine Datenbank schreibe und anschliessen auslese und in einer JTable publiziere. Die Aktualisierung der JTable soll in Echtzeit erfolgen. Bei meinem Code habe ich dazu ein Timer verwendet, der mir so immer die Tabelle aktualisiert. Das Problem ist nur, dass mir so immer der Arbeitsspeicher füllt, das heisst ich habe ein Speicher Leak.

Habt ihr eine Idee, wie ich dies verhindern kann?

Hier der Code:

Code:
Timer timer_1 = new Timer(0, new ActionListener() {
            
               @Override
               public void actionPerformed(ActionEvent ae) {
                   try {
                     
                        JScrollPane scrollPane_1 = new JScrollPane();
                        scrollPane_1.setBounds(38, 320, 350, 350);
//                        scrollPane_1.setFont(new Font("Tahoma", Font.PLAIN, 15));
                        add(scrollPane_1);                  
                        table_1 = new JTable();
                       
                       String query = "SELECT `Produkt`, `Anzahl`FROM `Bestellungen_Essen_SNF`, Produkte_SNF WHERE `Produkt_E` = product_id AND `Bestellnummer`='"+Home.min_best_essen_1+"' ";
                        PreparedStatement pst=(PreparedStatement) conn.prepareStatement(query);
                        ResultSet rs=pst.executeQuery();
                        table_1.setModel(DbUtils.resultSetToTableModel(rs));
                        table_1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                        table_1.setFont(new Font("Tahoma", Font.PLAIN, 20));
                        table_1.setRowHeight(40);
                        table_1.getColumnModel().getColumn(0).setMinWidth(300);
                        table_1.getColumnModel().getColumn(1).setMaxWidth(49);
                        scrollPane_1.setViewportView(table_1);
                        textField_tisch_1.setText(String.valueOf(Home.min_best_essen_tisch_1));
                        textField_nr_1.setText(String.valueOf(Home.min_best_essen_1));
                        textField_kommentar_1.setText(String.valueOf(show_kommentar(Home.min_best_essen_1)));
                   
                       
                       
                       
                    }catch (Exception ey) {
                        ey.printStackTrace();
                    }
               }
            });
Besten Dank im Voraus

Gruss Selmau
 
mrBrown

mrBrown

Du schließt z.B. deine Statements und ResultSets nicht.

Die Frage ist allerdings, ob du ein wirkliches Speicherleck (bis auf das fehlende Schließen) hast, oder der GC nur noch nicht aufgeräumt hat
 
J

Joose

Du erstellst außerdem jedes mal einen neues JScropllPane und einen neuen JTable und fügst diesem dem Fenster hinzu.
Entfernst du die alten überhaupt? Auch wenn die alten JTable Elemente nicht sichtbar sind bzw. gezeichnet werden sind sie logisch vorhanden und belegen natürlich Speicher!

Warum tauscht du nicht einfach nur den Content des JTables aus?
 
S

Selmau

Besten Dank, dass ist mir gar nicht aufgefallen...Hab es korrigiert und es funktioniert.
 
S

Selmau

Hallo Zusammen

Habe nun noch einen relativ kleinen Speicherverlust, dass heisst in rund 3 Stunden ist der Speicher meines Programms von 200Mb auf 550Mb angestiegen. Ich kenne leider die Probleme für Speicherverluste nicht ganz. Alle geöffneten Statements und Resultsets im Timer schliesse ich nun. Wo kann Speicher noch verloren gehen und wie kann ich diese Temporären Daten löschen? Muss ich jedes Objekt nach gebrauch mit der Anwendung .close(); wieder schliessen?
 
mrBrown

mrBrown

Steigender Speicherverbrauch ist in Java nicht zwingend ein Zeichen für ein Speicherleck, sondern u.U. einfach der Funktionsweise der JVM geschuldet.

Habe nun noch einen relativ kleinen Speicherverlust, dass heisst in rund 3 Stunden ist der Speicher meines Programms von 200Mb auf 550Mb angestiegen. Ich kenne leider die Probleme für Speicherverluste nicht ganz.
Benutz nen Profiler ;)

Muss ich jedes Objekt nach gebrauch mit der Anwendung .close(); wieder schliessen?
Nein, nur jedes Closeable (und da besser einfach try-with-resources nehmen)
 
Thema: 

Speicher Leak durch Tabellenaktualisierung

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben