java - 这会导致内存泄漏吗?

标签 java jdbc timer

这段代码会导致内存泄漏吗?

垃圾收集器何时被激活?是计时器结束的时候吗?或者即使计时器仍在运行,GC也会被调用?

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 类:

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();
    }
}

查询数据库的方法:

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;
        }
    }
}

最佳答案

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?

感觉垃圾收集随时都会发生。通常,当应用程序内存不足时。当计时器仍在运行时,GC 可能会运行,从而使您的应用程序暂停(使用并行/吞吐量收集器)。

所以基本上你无法控制 GC 何时启动。它可能随时发生,无论你在代码中做什么。

关于java - 这会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16533485/

相关文章:

java - 在 JDBC 中使用 class.forName

java - 取消定时器

java - javax 计时器上的 NullPointerException?

java - EditText .setError() 未在重新创建时应用我的自定义错误图标

java - Spring上传多个文件如何识别每个文件?

java - 将数据发送到 viewpager 的特定 fragment

java - Oracle 池数据源 - 无法找到 Spring NamespaceHandler

mysql - 存储过程输出始终返回 0.0

loops - 在 Xcode 上,只要屏幕保持不动,如何将变量 'counter' 每秒增加 1?

java - 在 Codename One 应用程序中使用 SQLite