Memory leaks 最终确定导致内存泄漏的方法?

Memory leaks 最终确定导致内存泄漏的方法?,memory-leaks,javafx-2,Memory Leaks,Javafx 2,我无法解决问题,需要你的帮助。当我点击菜单时,我调用客户帐户,然后关闭它。每次我打电话给客户帐户,内存都会增加。当我关闭帐户时,它应该会减少,但不会发生 课程菜单 mnItemCL_Cust.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent t) { try { panCenterPrev = (Pane) root.getCente

我无法解决问题,需要你的帮助。当我点击菜单时,我调用客户帐户,然后关闭它。每次我打电话给客户帐户,内存都会增加。当我关闭帐户时,它应该会减少,但不会发生

课程菜单

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);
          }
        }             
});
mnItemCL_Cust.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent t){
试一试{
panCenterPrev=(窗格)root.getCenter();
panCenterAct=Customer.listCustomer();
root.setCenter(null);
根.集心(胰脏);
Customer.btCanc.setOnAction(新的EventHandler(){
@重写公共无效句柄(ActionEvent e){
试一试{
客户职能指令手册();
panCenterAct.getChildren().clear();
胰脏=空;
root.setCenter(null);
根。设置中心(panCenterPrev);
}捕获(可丢弃的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();
    }
  }
公共类客户
{
公共静态窗格listCustomer()引发SQLException,ClassNotFoundException
{
...
最终ObservableList数据=FXCollections.observableArrayList();
...
}
公共静态类MyCustomer{
私有最终简单集成财产idcl;
私有MyCustomer(整数pIdcl){
this.idcl=新的SimpleIntegerProperty(pIdcl);
}
公共整数getIdcl(){
返回idcl.get();
}
公共void setIdcl(整数pIdcl){
idcl.set(pIdcl);
}
}  
公共静态无效Fim()抛出可丢弃{
...
rs=null;
tbViewCL.getItems().clear();
tbViewCL=null;
colIDCL.getColumns().clear();
colIDCL=null;
}
...
受保护的void finalize()抛出可丢弃的{
试一试{
...
rs.close();
……从来没有发生过……为什么??
}捕获(可丢弃的t){
掷t;
}最后{
showMessageDialog(null,“结束?”);
super.finalize();
}
}

关于

Java通常会在合适的时候回收您使用的内存,因此即使您最终确定了对象,内存也可能仍然存在从不执行,可能是因为在抛出异常之前有什么东西,我建议您在抛出异常之前检查代码,以确保没有任何东西在这样做,而且,如果捕获异常,最好将其记录下来,这样您就可以知道发生了什么。

这是抛出异常,还是不释放内存?然后是两个快速点:1。你从<代码>菜单的摘录在中间缺少了一些代码,或者在末尾有括号。只是没有足够的紧括号。2。代码> catch(可投掷T){扔t;}。似乎没有必要。请给出一个链接或简单的示例:在名为“menuitem”的内部调用一个类,并使用“Cancel”按钮销毁该类的所有对象…[我使用netbeans+JavaFX2]