我知道關於非靜態內部類的內存泄漏的問題已經被問過。我讀過的問題是this和this,但我不完全明白我在做什麼錯。java私有的內部類實例沒有被垃圾收集
我的類是如下
public class AddNewProductDialog {
private static AddNewProductDialog dialog;
private TextInputDialog newProductName = new TextInputDialog();
private AddNewProductDialog(){
}
public static AddNewProductDialog getInstance(){
if(dialog == null){
dialog = new AddNewProductDialog();
}
return dialog;
}
/*Helper Class start*/
private class AddNewProductDialogHelper{
private void initializeDialog(){ //---> Prepare a dialog box
newProductName.setTitle("Add New Product");
newProductName.setHeaderText("Note: This product name will be used as bat script file name. Eg. call_<productname>_script");
newProductName.setContentText("Product Name :");
newProductName.getDialogPane().lookupButton(ButtonType.OK).setDisable(true);
/*Something over here*/
newProductName.getEditor().textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
// TODO Auto-generated method stub
if(isInputvalid(newProductName.getEditor().getText())){
newProductName.getDialogPane().lookupButton(ButtonType.OK).setDisable(false);
}
}
});
}
private boolean isInputvalid(String text){
if(text.trim().length() > 0)
return true;
return false;
}
}
/*Helper class end*/
public AddNewProductDialog build(){
new AddNewProductDialogHelper().initializeDialog();
return this;
}
public void show() {
Optional<String> result = newProductName.showAndWait();
if(result.isPresent()){
//----> handle the input
}
}
}
AddNewProductDialog
的(外)類是具有輔助類AddNewProductDialogHelper
一個單獨的類。這個輔助類設置的TextInputDialog newProductName
我打電話AddNewProductDialog
類的build
方法,接着show
方法AddNewProductDialog.getInstance().build().show()
每次一個按鈕被點擊把用戶輸入的屬性。
我想AddNewProductDialogHelper
的實例是做初始化newProductName
dialog box
的問題是,的AddNewProductDialogHelper
的情況下,在堆內存中起球並收集垃圾沒有得到後進行垃圾回收。每次我按一下按鈕,獲取用戶輸入的是越來越創建一個新的實例,並不斷起球最多的按鈕被點擊
然而,當我評論這個代碼塊
newProductName.getEditor().textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
// TODO Auto-generated method stub
if(isInputvalid(newProductName.getEditor().getText())){
newProductName.getDialogPane().lookupButton(ButtonType.OK).setDisable(false);
}
}
});
它的工作原理和以前的實例是垃圾收集。 爲什麼評論此代碼塊有效?
我使用VisualVM檢查我堆轉儲
'isInputValid'是您的幫助器的方法,然後在偵聽器的關閉中。 –