- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在对标题感到沮丧之前,我想澄清一下我是 JavaFX UI 的新手。我作为一名开发人员已经 9 年了,使用 Swing,目前我决定尝试使用 JavaFX。网上的例子表明,与 Swing 相比,JavaFX 确实可以创建漂亮的 GUI。也许我试图以错误的方式创建和部署 GUI,但有一件事是肯定的。 JavaFX Pane 的加载速度比 Swing 慢,并且消耗更多的内存。使用 JAVAFX 重新设计了相同的 GUI,它需要将近 200Mb,而 Swing GUI 只需要 50Mb。
这里我给出一个代码示例,说明如何使用 FXML 以编程方式创建 GUI。
public class PanelCreator {
private FXMLPane<LoginPaneController> loginFXML;
private FXMLPane<RegistrationPaneController> registerFXML;
private FXMLPane<EmailValidationPaneController> emailValidationFXML;
public PanelCreator() {
this.rootPane = rootPane;
try {
loginFXML = new FXMLPane<LoginPaneController>("Login.fxml");
registerFXML = new FXMLPane<RegistrationPaneController>("Register.fxml");
emailValidationFXML = new FXMLPane<EmailValidationPaneController>("EmailValidation.fxml");
} catch (IOException e) {e.printStackTrace();} // catch
} // Constructor Method
public Pane getLoginPane() {
return loginFXML.getPane();
} // getLoginPane()
public Pane getRegisterPane() {
return registerFXML.getPane();
} // getRegisterPane
public Pane getEmailValidationPane() {
return emailValidationFXML.getPane();
} // getEmailValidationPane
public LoginPaneController getLoginPaneController() {
return loginFXML.getController();
} // getLoginPaneController()
public RegistrationPaneController getRegistrationPaneController() {
return registerFXML.getController();
} // getRegistrationPaneController()
} // class PanelCreator
PanelCreator 的构造方法创建了 3 个 FXMLPane 类,一个结合了 FXML Pane 和它的 Controller 的类。 FXMLPane 类的代码如下所示。
public class FXMLPane<T> {
private Pane pane;
private T paneController;
public FXMLPane(String url) throws IOException {
URL location = getClass().getResource(url);
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
pane = fxmlLoader.load(location.openStream());
paneController = fxmlLoader.<T>getController();
} // Constructor Method
public Pane getPane() {
return pane;
} // getPane()
public T getController() {
return paneController;
} // getController()
}
现在通过 PanelCreator,我可以使用 get 方法来获取每个 JavaFX 面板及其 Controller ,而且我不必每次都运行 FXML 加载方法来获取面板。目前,困扰我的不是 FXML GUI 的创建比 Swing 慢,而是 RAM 是相应 Swing 版本的 3 倍和 4 倍。
有人可以向我解释我做错了什么吗? FXML 文件在网格 Pane 上只有基本组件,如按钮、图层和文本字段等组件。
上面例子的代码可以找到here
最佳答案
总结评论部分的答案:
与 Swing 相比,JavaFX 是一个新的框架。它将随着时间的推移在性能和资源消耗方面得到改善。正如您在图 1 和图 3 中看到的,它已经得到了改进。它现在在 64 位 Linux 机器上使用 8 到 9MB 的内存。这比 Swing 版本的内存还要少。我用的是 Oracle Java
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
图 1:JavaFX 示例程序随时间的内存消耗。与已用内存相比,它显示了大量可用内存。多次手动触发GC,显示已用内存部分没有垃圾。
图 2:JavaFX 示例程序随时间的内存消耗,但没有手动触发 GC。使用的内存越来越大,因为没有触发 GC。
图 3:使用 GC 选项 -XX:+UseG1GC 的 JavaFX 示例程序随时间的内存消耗。在第一次 GC 循环之后,内存大小被减小以适合实际使用内存的大小。
关于performance - JavaFX 吃掉我的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28862834/
长期以来,我一直在寻找解决我的问题的方法,这就是我求助于您的原因: 考虑这段代码: static char done = 0; static void sigHandler(void) { d
我现在的职业是信息架构师和 JavaScript 开发人员,但最近我又回到了后端编码领域。而且,在尝试集成 HTML 原型(prototype)并与我们基于 C# 的 CMS 一起工作时,我与我们的程
我为 Jersey 创建了一个 LoggingFilter,并在 web.xml 中正确配置了它。一切正常。当我执行“GET”时,我得到 userPrincipal (request.getUserP
我没问题 Xcode 8.3.2 和 SourceKitService 正在使用我所有的 CPU。我在stackoverflow上阅读了很多问题,但找不到真正的解决方案。 我试过的: 清理项目数据:c
我是一名优秀的程序员,十分优秀!