简体   繁体   中英

Will this cause memory leak?

Will this code causes a memory leak?

When will the garbage collector be activated? Is it when the timer finishes? or GC will be called even though the timer is still running?

public static SwingWorker sw;

t2 = new Timer (300,this);
     t2.start();

@Override
public void actionPerformed(ActionEvent arg0) {
try {
    sw = new TextAreaMainPanelWorker();
    sw.execute();
} catch (Throwable e) {
    e.printStackTrace();
}   
}

TextAreaMainPanelWorker class:

public class TextAreaMainPanelWorker extends SwingWorker<Integer, Integer>
{

protected Integer doInBackground() throws Exception
{
    ConnectMysql.fetchMessage(MainPanel.jtep,MainPanel.sd,MainPanel.count);
    return 1;
}

protected void done()
{
    try
    {
        ConnectMysql.rodolfol(MainPanel.jtep, MainPanel.sd);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

Method for query to database:

public static void fetchMessage(JTextPane jtep,StyledDocument sd,int count  )
{
    try{

    String query = "SELECT members.username, message,color FROM chat JOIN members ON chat.user_id = members.id WHERE message_id > "+count+" AND user_id != 1";
    ps = con.prepareStatement(query);
    rs = ps.executeQuery();
    }catch(Exception e){}
}

public static void rodolfol(JTextPane jtep,StyledDocument sd){
    try {
        while(rs.next())
        {
            try {
                final JLabel jp = new JLabel(rs.getString("username")+ "\n");
                jp.setAlignmentY(0.75f);
                final String usernameChat = rs.getString("username");
                jp.addMouseListener(new MouseListener(){

                    @Override
                    public void mouseClicked(MouseEvent e) {}

                    @Override
                    public void mouseEntered(MouseEvent e) {
                        Cursor c = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
                        jp.setCursor(c);
                    }

                    @Override
                    public void mouseExited(MouseEvent e) {
                    }

                    @Override
                    public void mousePressed(MouseEvent e) {
                        if(SwingUtilities.isRightMouseButton(e)){System.out.print("lawl");}
                        if(e.getClickCount() == 2)new OneToOneChat(usernameChat);

                        jp.setForeground(Color.BLUE);
                    }

                    @Override
                    public void mouseReleased(MouseEvent e) {
                    jp.setForeground(Color.BLACK);
                    }
                });
                jp.setFont(new Font("arial",Font.BOLD,16));
                jtep.insertComponent(jp);
                StyleConstants.setForeground(MainPanel.sas2, Color.BLACK);
                MainPanel.sd.insertString(MainPanel.sd.getLength(), ": ", MainPanel.sas2);
                StyleConstants.setForeground(MainPanel.sas,new Color(Integer.parseInt(rs.getString("color"))));
                sd.insertString(sd.getLength(),rs.getString("message")+ "\n", MainPanel.sas);

            } catch (BadLocationException e1) {
            }finally{
            }
            MainPanel.count++;}
    } catch (SQLException e) {
    }finally{
    if (rs != null) {
            try {
                rs.close();
            } catch (SQLException sqlEx) { } 
            rs = null;
        }

    if (ps != null) {
            try {
                ps.close();
            } catch (SQLException sqlEx) { } 
            ps = null;
        }
    }
}

只要JVM认为有必要,就会调用GC。

When will the garbage collector be activated? Is it when the timer finishes? or GC will be called even though the timer is still running?

Garbage Collections will happen at any time, it feels like. Generally, when the application is running low on memory. GC may run when the timer is still running putting your application on pause (with Parallel/Throughput Collector).

So basically you have no control over when and the GC will kick in. It may happen at any time, regardless of what you are doing in your code.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM