我在将图像加载到应用程序时遇到了问题。我正在尝试制作一个简单的图像浏览器。在左边我有一个文件夹列表。单击列表上的文件夹名称后,图像应显示在右侧(流动窗格)。每张图片都在带边框的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);
}
答案 0 :(得分:4)
如果使用constructor缩放Image
,则所需内存量将大幅减少。
文档中的一些示例:
//加载图像并将其大小调整为100x150而不保留其原始宽高比
//图像位于类路径的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);
答案 1 :(得分:0)
我在JavaFX中遇到类似的内存问题,但是与setStyle方法有关。我已经分析了堆的使用情况,我发现StyleHelper对象保留了对setStyle方法设置的所有样式的所有引用(很多带有GC根的hashMap实例在com.sun.javafx.css.StyleManager $ Holder中)。风格经常变化时可能会出现问题。
尝试评论boxNaFotke.setStyle(styl);排队并检查是否有帮助。