我愿意在我的 JavaFX 應用程式中使用 Spring 引導技術(以利用其依賴注入的優勢),但我想知道對記憶體的影響,因為您知道任何帶有“組件”符號的類都將被加載到 MetaSpace(因為 Spring boot 會從中創建一個靜態物件),所以當有數十個 JavaFx 視圖控制器加載到 MetaSpace 時,它??們永遠不會從應用程式啟動到最后收集垃圾,這顯然是一件壞事,有什么辦法可以解決這個問題?
uj5u.com熱心網友回復:
你在評論中寫道:
當視圖控制器沒有被垃圾收集時,JavaFX 應用程式意味著視圖物件也將始終保留在那里 TableViews、ListViews、Panes ......這可能會占用一些重要的空間
但我認為不必如此。
參考 Java 節點的控制器實體只是一個 Java 物件,就像任何其他物件一樣,當 JVM 中不再有對它的參考時,可用于垃圾收集。
假設您像這樣配置 JavaFX SpringBoot 集成:
- 在 JavaFX 中添加 Spring 依賴注入(JPA Repo、Service)
因此,您將控制器工廠配置為使用 Spring bean:
fxmlLoader.setControllerFactory(
springContext::getBean
);
那么你的控制器是 Spring bean,你可以控制它的范圍。
如果您使用原型范圍:
@Bean
@Scope("prototype")
public PersonController personControllerPrototype() {
return new PersonController();
}
然后行為如中所述:
- 關于 Spring bean 容器中的作用域和垃圾回收
Spring 不管理原型 bean 的完整生命周期:容器實體化、配置和以其他方式組裝原型物件,并將其交給客戶端,沒有該原型實體的進一步記錄。
通常,您將創建一個控制器并添加對其實體化到場景圖中的物件樹的參考。如果您在導航時替換場景圖中的樹,并且沒有在任何地方保留對控制器的參考,則控制器和已從場景圖中洗掉的任何其他關聯節點都可能被垃圾收集。
或者,如果您只想加載 fxml 一次并永遠保持控制器,您可以使用單例范圍來做到這一點。
所以基本上,您可以選擇最適合您的應用程式或您正在使用的單個控制器的控制器的范圍和生命周期。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/391910.html
上一篇:函式findall(Sorty.by("created_at").descending())無法讀取屬性
下一篇:如何解決錯誤:packageorg.springframework.context.annotationdoesnotexistimportorg.springframework.context.an
