【问题标题】:Does using Spring boot with javafx will consume a lot of memory?使用 javafx 的 Spring boot 会消耗大量内存吗?
【发布时间】:2022-01-24 21:14:03
【问题描述】:

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

【问题讨论】:

  • 您好,该框架相当轻量级,内存使用主要取决于并发请求和应用程序代码
  • 那些对象的总内存可能很小;例如~100Kb。使用 Spring Boot、Spring DI 等的优势远远超过了内存使用量的这种小幅增加。 (这个问题对我来说听起来像是过早的优化。)但是如果你认为它会有所作为...... 测量它
  • @StephenC 你是完全正确的,但我认为这适用于 Web 开发案例,对于 JavaFX 应用程序,当视图控制器没有被垃圾收集时意味着视图对象也将永远留在那里 TableViews ,ListViews,Panes ...这可能会占用一些重要空间,我会尝试对其进行测试,谢谢。
  • (为了记录,100kB 是一个猜测。但即使内存开销是 10MB,我仍然认为这无关紧要。)
  • Singleton 的意思是“单个实例”。静态是一个实现细节。单身人士不一定是静态的!

标签: java spring spring-boot javafx


【解决方案1】:

你用 cmets 写:

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

但我认为不需要这样。

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

假设您像这样配置 JavaFX SpringBoot 集成:

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

fxmlLoader.setControllerFactory(
    springContext::getBean
);

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

如果你使用prototype scope

@Bean
@Scope("prototype")
public PersonController personControllerPrototype() {
    return new PersonController();
}

那么行为就是指定的:

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

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

或者,如果您只想加载一次 fxml 并永久保留控制器,您可以使用单例范围来执行此操作。

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

【讨论】:

  • 你几乎肯定想要控制器的原型范围,只是从应用程序逻辑的角度来看。如果您两次加载相同的 FXML,并且控制器具有单例范围,则会发生奇怪的事情,因为唯一的控制器实例只能引用一个 UI 实例。
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
相关资源
最近更新 更多