2013-05-14 90 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