2012-04-11 51 views
5

我創建了一個引發內存泄漏的示例應用程序。創建多個場景時的JavaFX 2.0內存泄漏

問題是我需要「重新加載」場景。如果我有兩個場景(Bar和Foo),每個場景都有一個按鈕(ButtonBar和ButtonFoo),則按鈕會更改當前場景以創建新場景。 如果我保持單擊ButtonBar和ButtonFoo 5分鐘(或更少),該簡單程序的內存消耗會越來越高。

Bar.java

public class Bar implements Initializable { 

@FXML 
private Label label; 

@FXML 
private void toFoo(ActionEvent event) { 
    try { 
     Button button = (Button) event.getSource(); 
     Parent root = FXMLLoader.load(getClass().getResource("Foo.fxml")); 
     Stage currentStage = (Stage) button.getScene().getWindow(); 
     currentStage.setScene(new Scene(root)); 
    } catch (IOException ex) { 
     Logger.getLogger(Bar.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 
}  
} 

的Foo.java是相同的變化去FXML負荷。

的FXML只包含一個按鈕:

<Button id="buttonBar" layoutX="126" layoutY="90" text="Bar!" onAction="#toFoo" fx:id="buttonBar" /> 

是否有一個真正的內存泄漏問題?有誰知道另一種方式來做到這一點?我希望這個應用能夠保持活力並永遠做出改變,就像服務一樣。 感謝

回答

1

我類似的問題。

當我在場景中移動鼠標。內存使用量增加,並且從來沒有下降。

我相信這與鼠標事件有關。

祝你好運!

+1

是的。任何與Scene Builder的交互都會以指數方式增加內存......這是從Java網站下載的最新版本。 WTF在這裏?這是你發佈後的2年... – crush 2014-09-10 15:14:05

1

我不知道的內存泄漏,但由於性能原因我會避免資源的重複加載。

我要做的就是保持這種根父在一個變量,並根據需要將其添加到一個場景,或在我的情況下,爲其他場景的特定部分,通過控制器類的靜態方法更新值。

我有好幾個,這些預加載的場景,該更新每個用戶從列表中選擇特定值時更大的場景的一部分。

1

我建議你試試FX8。已經有一些內存泄漏修復已經完成。

如果你不能,雖然更新到JavaFX的最新版本,我建議你不要在FXML使用onAction="#toFoo"

相反,聲明一個事件處理程序,並調用下面:buttonBar.addEventHandler(MouseEvent.MOUSE_CLICKED, declaredEventHandler);

在退出當前屏幕之前釋放事件處理程序:buttonBar.removeEventHandler(declaredEventHandler);