使用Spring boot和javafx会消耗大量内存吗?

You*_*iss 5 java spring javafx spring-boot

我愿意在我的 JavaFX 应用程序中使用 Spring boot 技术(以获得其依赖注入的优势),但我想知道对内存的影响,因为你知道任何带有“组件”符号的类都会被加载到 MetaSpace(因为 Spring boot 会从中创建一个静态对象),因此,将数十个 JavaFx 视图控制器加载到 MetaSpace 中,从应用程序启动到结束,它们永远不会被垃圾收集,这显然是一件坏事,有什么办法可以解决这个问题吗?

jew*_*sea 5

您在评论中写道:

\n
\n

当视图控制器没有被垃圾收集时,JavaFX 应用程序意味着视图对象将始终保留在那里 TableViews、ListViews、Panes ...这可能会占用一些重要的空间

\n
\n

但我不认为\xe2\x80\x99 需要那样。

\n

引用 Java 节点的控制器实例只是一个 Java 对象,与任何其他对象一样,当 JVM 中不再有对其的引用时,该实例将可用于垃圾回收。

\n

让\xe2\x80\x99s 假设你像这样配置 JavaFX SpringBoot 集成:

\n\n

因此,您将控制器工厂配置为使用 Spring beans:

\n
fxmlLoader.setControllerFactory(\n    springContext::getBean\n);\n
Run Code Online (Sandbox Code Playgroud)\n

那么你的控制器就是你可以控制其范围的Spring bean。

\n

如果您使用原型范围

\n
@Bean\n@Scope("prototype")\npublic PersonController personControllerPrototype() {\n    return new PersonController();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

那么行为如下:

\n\n
\n

Spring 不管理原型 bean 的完整生命周期:容器实例化、配置或以其他方式组装原型对象,并将其交给客户端,而不会进一步记录该原型实例。

\n
\n

通常,您将创建一个控制器并添加对其实例化到场景图中的对象树的引用。如果您在导航时替换场景图中的树,并且您不\xe2\x80\x99在任何地方保留对控制器的引用,则控制器和已从场景图中删除的任何其他关联节点都可以被垃圾收集。

\n

或者,如果您只想加载一次 fxml 并永远保留控制器,您可以使用单例作用域来做到这一点。

\n

因此基本上,您可以选择最适合您的应用程序或您正在使用的单个控制器的控制器的范围和生命周期。

\n

  • 无论如何,从应用程序逻辑的角度来看,您几乎肯定需要控制器的原型范围。如果您加载相同的 FXML 两次,并且控制器具有单例范围,则会发生奇怪的事情,因为唯一的控制器实例只能引用一个 UI 实例。 (3认同)