如何在关闭JavaFX阶段后释放内存?

如何在关闭JavaFX阶段后释放内存?,java,memory,memory-management,javafx-2,Java,Memory,Memory Management,Javafx 2,我正在创建一个JavaFx应用程序,当我在其中单击一个按钮时,它将在newstage中打开一个表。但我的问题是,当我关闭该表的阶段时,应用程序并没有释放内存。javaFX有什么问题吗?还是我得做点别的 我曾尝试在该阶段结束时将所有内容设置为空,但内存仍然无法释放 表阶段的结束事件: TableView TableView 舞台 我首先获取fxml文件的StreamObject(java.io.InputStream),然后将此StreamObject传递给FxmlLoader以加载页面 in=U

我正在创建一个
JavaFx
应用程序,当我在其中单击一个按钮时,它将在new
stage
中打开一个表。但我的问题是,当我关闭该表的
阶段时,应用程序并没有释放内存。javaFX有什么问题吗?还是我得做点别的

我曾尝试在该阶段结束时将所有内容设置为空,但内存仍然无法释放

表阶段的结束事件:

TableView TableView

舞台

我首先获取fxml文件的StreamObject(java.io.InputStream),然后将此StreamObject传递给FxmlLoader以加载页面

in=Utility.class.getResourceAsStream(fXml)


我在ininputstream对象中得到sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream的对象

内存管理和JavaFX没有什么特别之处。如果达到定义的内存限制,GC将运行。将对象设置为null后,它不会运行。 即使调用
System.gc()
,也不意味着gc将运行。从:

调用gc方法意味着Java虚拟机需要花费 努力回收未使用的对象,以使内存 它们目前可用于快速重用


要确定某个地方是否存在内存泄漏,可以使用例如查看应用程序是否(以及为什么)内存不足。

我正要发布一个非常类似的问题。我必须承认,我不是经过培训的软件工程师,我的应用程序开发风格可能依赖于一些“非细微差别”的实践和风格。我喜欢Java的一点是内置的内存管理。我不喜欢Java的一点是内置内存管理

例如,在VisualBasic6中,您可以确信,一旦对象的引用计数达到零,它将被销毁。在Visual Basic 6中实现模态对话框窗口非常简单:

Set myForm = new frmGetClientData
Call myForm.Initialize()
myForm.show, vbModal
nResult = myForm.getResult()
myForm.Hide()
Set myForm = nothing
一旦清除了对myForm的引用,它就会被销毁。这很方便,因为您可以确信每次都会构造并初始化一个新表单

在Java中,使用模态对话框窗口非常困难。对话框控制器对象不知道有关父控制器对象的任何信息,除非传递了引用。类似地,如果父控制器对象需要调用对话框控制器上的方法,则它必须获得对对话框控制器的引用。在构建新阶段时,父控制器必须获得对其自身阶段的引用,以便将对话阶段的模态设置为模态

所有这些引用都是前后指向的,在我看来,在Java中,模式对话框窗口永远不会被垃圾收集(因为指向父窗口和控制器的引用应该保持有效)。。。每次使用FXMLLoader构建和显示对话框窗口时,一个新的大型对象将以很长的生命周期结束在内存中。在我看来,在Java中使用模态对话框窗口会导致内存泄漏

一种解决方案是进入VisualBasic模式,在不再使用对话框窗口和控制器时,认真地释放对它们的引用。真麻烦。这仍然不能保证窗口何时被破坏

另一种解决方案是创建一个对话框池,并使用初始化方法构建它们,每次需要时将它们设置为已知的初始状态,而不是每次要显示对话框窗口时都构建一个新窗口(就像我使用Visual Basic所做的那样)


有人对JavaFX有见解吗?我正在编写一个帮助器类来帮助我构建和管理模态对话框窗口,但在我看来,这真的不必要。我可能只是在为自己做额外的工作。

我的意思是,我使用inputstream加载场景的方式不会释放内存。@Ronak你认为这是为什么?你认为什么是不可能的?你用VisualVM检查过了吗?如果我一次又一次地打开和关闭该表的阶段,那么内存会持续增加。但在关闭阶段事件时,它应该被减少。@Ronak再次声明:当某些内容被关闭或设置为null时,VM不会运行垃圾收集(这将导致非常糟糕的性能)。如果您为应用程序提供的内存不足,则会启动GC。试着了解GC是如何工作的,也许对你有帮助。
 public static Initializable replaceScene(String fXml, Stage mystage) {
    InputStream in = null;
    try {
        FXMLLoader loader = new FXMLLoader();
        in = Utility.class.getResourceAsStream(fXml);
        loader.setLocation(Utility.class.getResource(fXml));
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        AnchorPane page;
        try {
            page = (AnchorPane) loader.load(in);
        } finally {
            in.close();
        }
        Scene scene = new Scene(page);
        mystage.setScene(scene);
        return loader.getController();
    } catch (Exception ex) {
        return null;
    }
}
Set myForm = new frmGetClientData
Call myForm.Initialize()
myForm.show, vbModal
nResult = myForm.getResult()
myForm.Hide()
Set myForm = nothing