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

优化JavaFX中的内存泄漏

傅雪松
2023-03-14

我写了一段代码,让字母在我写的时候出现并飞行。这个问题消耗了大量的内存。

我已经优化了一点

  • 在侦听器中共享路径对象并更新其参数。
  • 每次打印新字母时调用 gc

但是它仍然使用大量的内存,所以有什么想法来降低它的内存利用率吗?

提前致谢。



    package sample;

    import javafx.animation.PathTransition;
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.layout.Pane;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.LineTo;
    import javafx.scene.shape.MoveTo;
    import javafx.scene.shape.Path;
    import javafx.scene.text.Font;
    import javafx.scene.text.Text;
    import javafx.stage.Stage;
    import javafx.util.Duration;

    public class Main extends Application {

        public static void main(String[] args) {
            launch(args);
        }

        @Override
        public void start(Stage primaryStage) throws Exception {
            Pane root = new Pane();
            Scene scene = new Scene(root);
            root.setCache(false);
            primaryStage.setTitle("Hello World");
            primaryStage.setScene(scene);


            Path path = new Path();
            root.widthProperty().addListener((observableValue, oldSceneWidth, newSceneWidth) -> SetPathElements(path, root));
            root.heightProperty().addListener((observableValue, oldSceneWidth, newSceneWidth) -> SetPathElements(path, root));


            Duration duration = Duration.millis(1000);

            scene.setOnKeyPressed(event -> {
                System.gc();

                Text textNode = new Text(event.getText());
                textNode.setFont(Font.font(50));
                textNode.setFill(Color.ORANGE);
                root.getChildren().add(textNode);


                PathTransition pathTransition = new PathTransition();
                pathTransition.setDuration(duration);
                pathTransition.setPath(path);
                pathTransition.setCycleCount(1);

                pathTransition.setNode(textNode);
                pathTransition.setOnFinished(event1 -> {
                    root.getChildren().remove(textNode);
                    pathTransition.setNode(null);
                    pathTransition.setPath(null);
                    textNode.setFont(null);
                    textNode.setFill(null);
                });
                pathTransition.play();


            });
            primaryStage.show();
        }

        private void SetPathElements(Path path, Pane root) {
            path.getElements().clear();
            double w = root.getWidth();
            double h = root.getHeight();
            path.getElements().add(new MoveTo(w / 2, h));
            path.getElements().add(new LineTo(w / 2, -40));
        }
    }


操作系统:Arch Linux 64位平台:英特尔i7-第三代,8 GB内存IDE : Intellij JDK : 1.8.0_102

共有2个答案

逑何平
2023-03-14

升级到Mesa 13.0.4并不能解决该问题,但有一个解决方法。

如果程序是用-Dprism运行的。order=j2d-D棱镜。order=swVM参数,JavaFX呈现引擎不使用OpenGL,并且不会发生泄漏。当然,在这种情况下,应用程序性能会显著降低。

姬墨竹
2023-03-14

用Mesa的JavaFX内存泄漏

更新(2016年11月)
此问题似乎已在较新版本的Mesa和/或X.org.更新到Mesa 13.0和X.org

相关链接:

  • openjfx-dev 讨论线程。
  • 红滴讨论。
  • 台面讨论。
  • 相关 SO 帖子: JavaXF 8 进度条和进度指示器与进程=-1 内存泄漏在 Linux 上
 类似资料:
  • 本文向大家介绍详解Android性能优化之内存泄漏,包括了详解Android性能优化之内存泄漏的使用技巧和注意事项,需要的朋友参考一下 综述 内存泄漏(memory leak)是指由于疏忽或错误造成程序未能释放已经不再使用的内存。那么在Android中,当一个对象持有Activity的引用,如果该对象不能被系统回收,那么当这个Activity不再使用时,这个Activity也不会被系统回收,那这么

  • 我尝试用一个大表(大约一万条记录)中的记录填充JdbcRowSet。我尝试了两个变体(参见下面的代码): 创建连接对象,使用JdbcRowSetImpl(connection)实例化,在循环中执行查询。 使用JdbcRowSetImpl(DriverManager.GetConnection(“jdbc:....”)实例化,在循环中执行查询。 第一个变体会导致内存泄漏,直到堆满为止。第二个变体没有

  • 我有一个JavaFX应用程序,当按下X按钮时,它可以最大限度地减少对托盘的访问。我一直在通过VisualVM监控应用程序的内存趋势。 奇怪的是,当应用程序打开或最小化到任务栏时,内存总是会被重新分配到最初使用的内存。但是,当它最小化到托盘()时,

  • 我有一个在Tomcat7上运行的web应用程序的问题。 当我尝试重新启动web应用程序时,我在servlet内部创建的线程打开的端口仍然是打开的。 “http-bio-8080-acceptor-0”后台进程prio=10 tid=0x00007F4ED4206000 nid=0x71f0 runnable[0x00007F4ECC78F000]java.lang.thread.state:run

  • 我在Tomcat中得到了threadlocal内存泄漏错误,我正在使用ThreadPool,但在我的WebApp中没有threadlocal的实现。 严重:web应用程序[/mywebapp]创建了一个ThreadLocal,其键类型为[org.a pache.http.impl.cookie.dateformatholder$1](值为[org.apache.http.imp l.cookie.

  • 本文向大家介绍浅析Java中的内存泄漏,包括了浅析Java中的内存泄漏的使用技巧和注意事项,需要的朋友参考一下 ava最明显的一个优势就是它的内存管理机制。你只需简单创建对象,java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏。 本教程演示了什么是内存泄漏,为什么会发生内存泄漏以及如何预防内存泄漏。 什么是内存泄漏? 定义:如果对象在应用中