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 - 加载图像和内存问题的主要内容,如果未能解决你的问题,请参考以下文章