当前位置: 首页 > 知识库问答 >
问题:

将Spring boot与javafx一起使用会消耗大量内存吗?

符畅
2023-03-14

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

共有1个答案

斜向文
2023-03-14

你在评论中写道:

JavaFX应用程序当视图控制器没有被垃圾回收时,也意味着视图对象将始终停留在那里——表视图、列表视图、窗格。。。这可能需要一些重要的空间

但我觉得没必要这样。

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

假设您将JavaFX SpringBoot集成配置为:

  • 在JavaFX中添加Spring依赖注入(JPA Repo,服务)

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

fxmlLoader.setControllerFactory(
    springContext::getBean
);

然后您的控制器是Spring bean,您可以控制其范围。

如果使用prototype scope:

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

然后行为如以下所述:

  • 关于Springbean容器中的范围和垃圾收集

Spring不管理prototype bean的整个生命周期:容器实例化、配置和以其他方式组装prototype对象,并将其交给客户机,而没有该prototype实例的进一步记录。

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

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

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

 类似资料:
  • 似乎是正在消耗大量内存,即使在应该释放任何资源之后也是如此。简单的演示 产出: 如果替换部分, 使用率大幅下降: 我在这里误解了什么/做错了什么?正在加载的文件很大(~60MB),但即使XNode需要使用那么多内存,也不应该在时间?

  • 我有一个很小的java控制台应用程序,我想在内存使用方面进行优化。它是在Xmx设置为仅64MB的情况下运行的。根据不同的监视工具(htop、ps、pmap、Dynatrace)显示进程的总体内存使用量超过250MB。我主要在Ubuntu18上运行它(也在其他操作系统上测试)。 我使用了-xx:nativeMemoryTracking,java param和jcmd的本地内存跟踪,以找出为什么在堆之

  • 问题内容: 我试图检查Go如何处理100,000个goroutine。我写了一个简单的程序来产生许多例程,除了打印一些公告外什么也不做。我将MaxStack大小限制为只有512个字节。但是我注意到程序的大小并没有因此而减少。它消耗了大约460 MB的内存,因此每个goroutine消耗了大约4 KB的内存。我的问题是,我们可以将goroutine的最大堆栈大小设置为低于“最小”堆栈大小(可能为4

  • 是否可以限制会话和与之相关的请求可以使用的内存量? 例如,我希望将每个用户会话限制为一兆字节。此限制应适用于处理请求时创建的任何对象。有可能吗?

  • 问题内容: 该表包含大约一千万行。 这会导致内存使用量稳定增加到4 GB左右,这时行将快速打印。第一行打印之前漫长的延迟使我感到惊讶–我希望它几乎可以立即打印。 我也尝试过以相同的方式表现。 我不知道Django将什么加载到内存中或为什么这样做。我希望Django在数据库级别遍历结果,这意味着结果将以大致恒定的速率打印(而不是经过漫长的等待一次全部打印)。 我误会了什么? (我不知道它是否相关,但

  • 当我刚接触drools时,我浏览了一些论坛,开发了一个使用KnowledgeBuilder api和StatefulKnowledgeSessions配置drools的应用程序。当时drools文件的数量较少,并且与应用程序打包在一起。分析时,我发现drools消耗了大量内存,内存分配率(TLAB)很高。这让我思考,是否需要有一个缓存解决方案,以避免每次有应用程序请求时都创建KnowledgeSe