2012-04-11 74 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);