2013-05-14 91 views
1

此代码是否会导致内存泄漏?这会造成内存泄漏吗?

何时启动垃圾回收器?定时器结束时是否?或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(); 
    } 
} 

方法数据库:每当JVM觉得有必要这么做

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

Java GC基于* object reachability而工作* - 任何从根不可达的对象(例如,静态成员,当前堆栈中的局部变量等)都有资格被回收。回收实际发生的时间和方式取决于GC。 – user2246674 2013-05-14 00:57:55

+0

http://stackoverflow.com/questions/5690309/garbage-collector-in-java-set-an-object-null,http://stackoverflow.com/questions/5667705/in-java-when-does-an -object-become-unreachable,http://stackoverflow.com/questions/2046761/what-is-object-graph-in-java等 – user2246674 2013-05-14 01:00:02

+0

这里观察到的问题究竟是什么?它看起来像连接的生命周期可能没有适当的限制,但.. – user2246674 2013-05-14 01:08:36

回答

1

何时启动垃圾回收器?定时器结束时是否?或GC将被调用,即使计时器仍在运行?

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

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

+0

将我的代码导致一个内存泄漏cayse连接将一直打开??我读了一些关于未被关闭的文章,他们说这会导致内存泄漏,这是真的基于我的代码? – 2013-05-14 01:05:40

+0

它不会导致内存泄漏。由于Connection会长时间打开,因此只要有(强烈的)引用,它就会移动到旧的一代,并保持在那里。如果您开始向“HashMap”或其他集合添加对象并忘记它们,则可能会出现“内存泄漏”。因为它们是从'HashMap'引用的,所以它们不会被收集,因此会导致内存泄漏。希望这可以帮助。 – goblinjuice 2013-05-14 01:08:10

1

GC会被调用。

+0

所以基于我的代码sw = new TextAreaMainPanelWorker();当sw会有新的参考时,sw会收集垃圾? – 2013-05-14 01:00:15

+0

我不知道你是如何从我的答案中推断出来的。在JVM *之前的运行中,可能会有20个悬挂引用,“因为缺少内存”*(由于内存不足),因此无法运行GC。 – 2013-05-14 01:02:35

+1

@DasdaSdasd该对象将成为回收的*符合条件*(假设它不是强烈可及的)。 – user2246674 2013-05-14 01:03:37