Countdown verursacht Speicher Leak

Negi

Mitglied
Hallöle,

wie der Titel schon sagt verursacht bei mir ein Countdown den ich über ein JLabel laufen lasse ein Speicher Leak und ich bin ratlos wie jenes beheben soll.
Der Countdown wird mit dem Timer von javax.swing realisiert.

Zum Quellcode:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package shutdown;

/**
 *
 * @author IP-Error
 */


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ShutdownMain extends JFrame implements ActionListener{

    /**
     * @param args the command line arguments
     */
    private JLabel text, Stunde, Minuten,countdown;
    private JRadioButton shutdown, hold, restart;
    private ButtonGroup gruppe;
    private JComboBox Std, Min;
    private JButton run, abort;
    private String[] std, min;
    int stunde=1 , minute=0;
    long wait, time_left;
    private String todo="s";
    private Action a;
    private Timer Countdown;
    private final ActionListener taskPerformer;
    private long h,mins,sec;

    public ShutdownMain() throws Exception{
        final Container container = getContentPane();
        setLayout(null);
        setTitle("Shutdown");
        
        //initialisiern der zeit arrays
        std= new String[24];
        min= new String[60];
        for(int i=0; i<24; i++){
            std[i]=""+i;
        }
        for(int i=0; i<60; i++){
            min[i]=""+i;
        }
        countdown=new JLabel("00:00:00");
        countdown.setBounds(250, 50, 75, 25);
        container.add(countdown);

        taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                time_left -= 40;

                h= time_left/3600000;
                mins= (time_left-h*3600000)/60000;
                sec= ((time_left-h*3600000)-mins*60000)/1000;
                countdown.setText(h+":"+mins+":"+sec);
            }
        };
        Countdown = new Timer(40,taskPerformer);

        

        text = new JLabel();
        text.setBounds(0, 170, 380, 25);
        container.add(text);

        Stunde = new JLabel("Stunden:");
        Stunde.setBounds(110, 0, 50, 25);
        container.add(Stunde);

        Std = new JComboBox(std);
        Std.setSelectedIndex(1);
        Std.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                stunde= Std.getSelectedIndex();
            }
        });
        Std.setBounds(175, 0, 50, 20);
        Std.setBackground(Color.white);
        container.add(Std);

        Minuten = new JLabel("Minuten:");
        Minuten.setBounds(250, 0, 50, 25);
        container.add(Minuten);

        Min = new JComboBox(min);
        Min.setSelectedIndex(0);
        Min.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                minute=Min.getSelectedIndex();
            }
        });
        Min.setBounds(315, 0, 50, 20);
        Min.setBackground(Color.white);        
        container.add(Min);

        shutdown=new JRadioButton("Herunterfahren");
        shutdown.setActionCommand("s");
        shutdown.setBounds(0,45,200,25);
        //shutdown.setBackground(new Color(82,244,106));


        restart = new JRadioButton("Neustart");
        restart.setActionCommand("r");
        restart.setBounds(0, 90, 200, 25);
        //restart.setBackground(new Color(82,244,106));



        hold = new JRadioButton("Ruhezustand");
        hold.setActionCommand("h");
        hold.setBounds(0,135,200,25);
        //hold.setBackground(new Color(82,244,106));

        shutdown.addActionListener(this);        
        restart.addActionListener(this);
        hold.addActionListener(this);

        gruppe= new ButtonGroup();
        gruppe.add(shutdown);
        gruppe.add(restart);
        gruppe.add(hold);
        shutdown.setSelected(true);
        container.add(shutdown);
        container.add(restart);
        container.add(hold);
        
        

        run = new JButton("Starten");
        run.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                wait= stunde*3600000+minute*60000;
                time_left = wait;
                abort.setVisible(true);
                run.setVisible(false);
                if(todo.equals("s")){
                    text.setText("Das System wird in "+stunde+" Stunden und "+minute+" Minute ausgeschaltet.");
                    a = new Action(todo+" -t 0", wait);
                    Countdown.start();
                }
                else{
                    if(todo.equals("r")){
                        text.setText("Das System wird in "+stunde+" Stunden und "+minute+" Minuten Neugestartet.");
                        a = new Action(todo+" -t 0", wait);
                        Countdown.start();
                    }
                    else{
                        if(todo.equals("h")){
                            text.setText("Das System wird in "+stunde+" Stunden und "+minute+" Minuten ausgeschaltet.");
                            a = new Action(todo, wait);
                            Countdown.start();
                        }
                    }
                }
                
            }
        });
        run.setBounds(50, 215, 100, 35);
        container.add(run);

        abort = new JButton("Abbrechen");
        abort.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                a.abort();
                run.setVisible(true);
                abort.setVisible(false);
                Countdown.stop();
                
                text.setText("Aktion Abgebrochen!");

            }
        });
        abort.setBounds(200,215,100,35);
        abort.setVisible(false);
        container.add(abort);

        pack();
        setSize(400,300);
        setVisible(true);
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        
    }
    public void actionPerformed(ActionEvent e){
        todo= e.getActionCommand();
    }

    public static void main(String[] args) throws Exception{
        // TODO code application logic here
        new ShutdownMain();

    }
}

Der Leak ist zwar nur gering(4-12 K/sec) doch wenn ich den Countdown eine Stunde lang oder mehr(was vorkommen kann) ausführe würde sich der Ram ziehmlich zusetzen.

Ich hoffe mir kann jemand meinem Fehler zeigen oder mir eine Alternative nennen.

Gruß Negi

PS:
Ach und ein nettes Hallo meinerseits. Bin neu hier, habe aber schon des öfteren Beiträge hier gelesen.
Ich Studiere Informatik und bin im 3 Semester. Ausserdem Arbeite ich für einen Professor meiner Uni als Studentische hilfskraft und Programmiere dort in Java für eine Projecktarbeit. Mein Wissensstand in Java ist daher doch schon über dem eines Anfängers. Wenn auch noch nicht so das ich sagen würde ich habe Java Erfunden xD
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Das ist zwar unglaublich schlechter Code, daher bin ich noch nicht 100% sicher, aber ein Speicherleck scheint nicht vorzuliegen. Ich vermute das der Heap einfach noch nicht die Xmx Grenze erreicht hat und da dein Programm ständig beschäftigt ist und keine akute Veranlassung vorliegt, räumt der GC noch nicht ab.
Mein Wissensstand in Java ist daher doch schon über dem eines Anfängers.
Das ist jetzt nicht böse gemeint, aber wenn ich den Code so sehe würde ich widersprechen. Schau dir als allererstes mal die Java Coding Conventions an, kein Mensch will solchen Code lesen müssen.
Programme sinnvoll zu strukturieren lernst du früher, oder später wohl automatisch, aber die Coding Conventions solltest du von Anfang an beachten.
 

fastjack

Top Contributor
Ich denke auch, der Countdown könnte eine Pause vertragen. Z.B. mit Thread.sleep(1000) für eine einsekündige Pause.
 

Negi

Mitglied
Hmm gut dann weiß ich bescheid. Werde mir die convention mal reinziehen und mich zukünftig hoffentlich dahach richten ^^
Wusste vorher nichmal das es sowas gibt (schande über mein haupt).
 

Wildcard

Top Contributor
Wusste vorher nichmal das es sowas gibt (schande über mein haupt).
Das wichtigste ist die Groß- Kleinschreibung.
Java:
String variablenImCamelCase;
public void methodenAuch(){}
public KlassenGroßCamelCase{}
public static final int KONSTANTEN_GROß_MIT_UNDERSCORE = 5;
...

Du hast zum Beispiel zwei Member 'countdown'. Einmal als JLabel mit kleinem c und dann als Timer mit großem C. Sowas geht gar nicht...
Code Conventions for the Java(TM) Programming Language: Contents
 

Negi

Mitglied
Ja gut weiß ich bescheid... Mein problem is halt immer vernünftige Namen zu finden -.- werde auf jeden Fall nochmal drüber arbeiten über den Quellcode.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Countdown in Label anzeigen AWT, Swing, JavaFX & SWT 14
S Swing Countdown mit Minuten und Sekunden AWT, Swing, JavaFX & SWT 9
S Swing Timer, Countdown AWT, Swing, JavaFX & SWT 2
J JTable verursacht NullPointerException.Ratlos. AWT, Swing, JavaFX & SWT 5
J JList verursacht Absturz AWT, Swing, JavaFX & SWT 29
B JTable ValueChanged verursacht Exception AWT, Swing, JavaFX & SWT 3
U ImageIO.read verursacht heap space AWT, Swing, JavaFX & SWT 15
M JTable verursacht NullPointerException AWT, Swing, JavaFX & SWT 8
Lukas2904 Wie speicher ich eine Einstellung? AWT, Swing, JavaFX & SWT 1
A Button mit Speicher-Funktion AWT, Swing, JavaFX & SWT 8
S Speicher Leak durch Tabellenaktualisierung AWT, Swing, JavaFX & SWT 5
A AWT Beim (mehrmaligen) Screenshot machen läuft der Speicher voll AWT, Swing, JavaFX & SWT 2
C Swing Speicher-Hinweis bei Formularänderungen AWT, Swing, JavaFX & SWT 12
S Swing Fenster schliessen, javaw noch im Speicher AWT, Swing, JavaFX & SWT 5
G datensätze aus der db in einer arraylist speicher und in gui AWT, Swing, JavaFX & SWT 4
P Warum braucht mein kleines Programm 20 MB Speicher? AWT, Swing, JavaFX & SWT 13
K JListen Inhalt speicher AWT, Swing, JavaFX & SWT 2
W JFileChooser speicher von Datein mit und ohne ende AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben