2012-11-16 30 views
0

我無法解決問題並需要您的幫助。當我點擊菜單時,我打電話給客戶帳戶,然後關閉它。每次我打電話給客戶帳戶時,內存都會增加。當我關閉帳戶時它應該會減少,但它不會發生。Finalize方法導致內存泄漏?

類菜單

mnItemCL_Cust.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(ActionEvent t) { 
    try { 
     panCenterPrev = (Pane) root.getCenter(); 
     panCenterAct = Customer.listCustomer(); 
     root.setCenter(null); 
     root.setCenter(panCenterAct); 
     Customer.btCanc.setOnAction(new EventHandler<ActionEvent>() { 
     @Override public void handle(ActionEvent e) { 
      try { 
      Customer.Fim(); 
      panCenterAct.getChildren().clear(); 
      panCenterAct = null; 
      root.setCenter(null); 
      root.setCenter(panCenterPrev); 
      } catch (Throwable ex) { 
      Logger.getLogger(Customer.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     }    
}); 

類客戶

public class Customer 
{ 

    public static Pane listCustomer() throws SQLException, ClassNotFoundException 
    { 
    ... 
    final ObservableList<MyCustomer> data = FXCollections.observableArrayList(); 
    ... 
    } 

    public static class MyCustomer { 
    private final SimpleIntegerProperty idcl; 
    private MyCustomer(Integer pIdcl) { 
     this.idcl = new SimpleIntegerProperty(pIdcl); 
    } 

    public Integer getIdcl() { 
     return idcl.get(); 
    } 

    public void setIdcl(Integer pIdcl) { 
     idcl.set(pIdcl); 
    } 
    } 

    public static void Fim() throws Throwable { 
    ... 
    rs = null; 

    tbViewCL.getItems().clear(); 
    tbViewCL = null; 
    colIDCL.getColumns().clear(); 
    colIDCL = null; 
    } 

    ... 

    protected void finalize() throws Throwable { 
    try{ 
     ... 
     rs.close(); 
     ...// Never happens... why?? 
    } catch(Throwable t) { 
     throw t; 
    } finally { 
     JOptionPane.showMessageDialog(null,"End?"); 
     super.finalize(); 
    } 
    } 

問候

+0

這是否拋出任何異常,或只是不釋放內存?然後有兩個簡單的要點:1.你從'Menu'中摘錄的內容或者缺少一些中間的代碼,或者在最後使用大括號。沒有足夠的大括號。 2. catch(Throwable t){throw t;}'似乎沒有必要。 – Windle

回答

0

的Java通常收回你使用時,看到它適合,因此,即使你完成了內存對象,內存可能仍然在那裏。但是,如果rs.Close()從不執行,可能是因爲它之前的某些內容是拋出和異常,我建議您在確保沒有任何內容正在執行之前檢查代碼,並且,如果發現異常是記錄它的好習慣所以你可以知道發生了什麼。

+0

請注意,一個鏈接或簡單的例子:在'menuitem'內部調用一個類,白色按鈕'取消'銷燬該類的所有對象... [我使用netbeans + javafx 2] – user1685657