JavaFX - 加载图像和内存问题

Posted

技术标签:

【中文标题】JavaFX - 加载图像和内存问题【英文标题】:JavaFX - Loading images and memory problems 【发布时间】:2013-02-11 20:29:50 【问题描述】:

我在将图像加载到我的应用程序时遇到了问题。我正在尝试制作一个简单的图像浏览器。在左边我有一个文件夹列表。单击列表图像上的文件夹名称后,应出现在右侧(流窗格)。每个图像都在一个带边框的 HBox 中。 但是我很快就会遇到这样的错误:

java.lang.outofmemoryerror java heap space

我查看了任务管理器 - 如果我只加载 6 张照片,应用程序会占用 500mb 的内存! 还有一件事 - 如果我更改列表中的文件夹,内存仍然被占用。 在选择另一个文件夹时,我正在创建新的 flowPane

flowPane = new FlowPane();

那么垃圾收集器应该删除所有 ImageView 的旧的,对吧?

如何有效管理应用中的图片?

  for(int i = 0 ; i < zdjecia.length; i++)
        ImageView iv2 = new ImageView();
        Image image = new Image("file:"+zdjecia[i].getAbsolutePath());
         iv2.setImage(image);
         if( image.getHeight() > image.getWidth())
                iv2.fitHeightProperty().bind(szerokoscZdjecia.multiply(0.8).subtract(6));
        else
                iv2.fitWidthProperty().bind(szerokoscZdjecia.subtract(6));

         iv2.setPreserveRatio(true);
         iv2.setSmooth(true);
         iv2.setCache(false);

         String styl = "-fx-border-color: #b2b3b3;"
                 + "-fx-border-width: 2;";

         HBox boxNaFotke = new HBox();
         boxNaFotke.prefWidthProperty().bind(szerokoscZdjecia);
         boxNaFotke.prefHeightProperty().bind(szerokoscZdjecia.multiply(0.8));
         boxNaFotke.setAlignment(Pos.CENTER);
         boxNaFotke.setStyle(styl);
         boxNaFotke.getChildren().add(iv2);
         fotki.add(boxNaFotke);
         flowPane.getChildren().add(boxNaFotke);
    

【问题讨论】:

我也有同样的问题:( 【参考方案1】:

如果您使用constructor 扩展Image,所需的内存量将大大减少。

文档中的一些示例:

// 加载图像并将其大小调整为 100x150,而不保留其原始纵横比 // 图片位于classpath的my.res包中Image image2 = new Image("my/res/flower.png", 100, 150, false, false);

// 加载图像并将其调整为 100 的宽度,同时保留其 // 原始纵横比,使用更快的过滤方法//图像是 通过 http 协议从提供的 URL 下载 Image image3 = new Image("http://sample.com/res/flower.png", 100, 0, false, false);

【讨论】:

【参考方案2】:

JavaFX 中的内存存在类似问题,但与 setStyle 方法有关。我分析了堆使用情况,发现 StyleHelper 对象保留了对 setStyle 方法设置的所有样式的所有引用(com.sun.javafx.css.StyleManager$Holder 中有很多具有 GC 根的 HashMap 实例)。当风格经常改变时,这可能是一个问题。

尝试评论 boxNaFotke.setStyle(styl);行并检查它是否有帮助。

【讨论】:

以上是关于JavaFX - 加载图像和内存问题的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法强制 JavaFX 释放视频内存?

ipad:图像加载和内存管理问题以及应用程序崩溃

清理 JavaFX 属性侦听器和绑定(内存泄漏)

内存优化加载一张图像资源到底占据多少内存

与基于摇摆的图表相比,为啥基于 javafx 的图表占用更多内存

使用 C# 的图像加载内存泄漏