JavaFX - 加载图像和内存问题

时间:2013-02-26 11:43:56

标签: java image memory javafx load

我在将图像加载到应用程序时遇到了问题。我正在尝试制作一个简单的图像浏览器。在左边我有一个文件夹列表。单击列表上的文件夹名称后,图像应显示在右侧(流动窗格)。每张图片都在带边框的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);
    }

2 个答案:

答案 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);排队并检查是否有帮助。