java堆内存问题

Teo*_*Teo 4 java caching bufferedimage

我的应用基本上是一个照片浏览器.我的做法(不要评判我,我是java新手)是要ArrayList填充BufferedImages然后将图像添加到JList(向左).

这是我得到一个图像的方式:

private void getFullImage() {

        BufferedImage im = null;        


        ImageReader imageReader = null;
            try {
                System.out.println("Loading "+original+"...");
                String suffix = Utils.getFileExt(original.getName(), "jpg");
                @SuppressWarnings("rawtypes")
                Iterator readers = ImageIO.getImageReadersBySuffix(suffix);
                imageReader = (ImageReader)readers.next();
                imageReader.setInput(new FileImageInputStream(original));
                im = imageReader.read(0);
                imageReader.dispose();
            } catch (Exception e)
            {
                e.printStackTrace();
            }

        this.img = im;
    }
Run Code Online (Sandbox Code Playgroud)

然后,在我获取所有数据后,我会将图像添加到我的JList:

   Vector vector = new Vector();
   JPanel container = null;
   PhotoPanel pp = null;
   Photo p = null;
   for(int i=0;i<files.length;i++)
   {
        p = new Photo(files[i]);
        pp = new PhotoPanel(p);
        container = new JPanel(new BorderLayout());
        container.add(pp,BorderLayout.CENTER);
                                       container.setBorder(BorderFactory.createTitledBorder(p.getTitle()));
                                vector.addElement(container);
  }
   plist.setListData(vector);
Run Code Online (Sandbox Code Playgroud)

如果我有10个文件,该应用程序运行良好.问题是我有更多的图像要显示.然后我会得到一个例外:Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space.所以,我知道我的方法非常糟糕,我想知道如何拍摄和存储所有图像并让它们显示在图像中JList.也许使用缓存?我读过一些关于SoftReference但我真的不知道如何使用它的内容.谢谢.

Xen*_*oRo 5

导致此问题的原因主要有两个:


第一个,我发布的更多是警告,而不是在你的情况下作为一个实际原因,是在控制台上打印过多的数据System.out.println().

我不确定它是仅在NetBeans或所有开发工具中发生的.但不管怎样,它需要一个真正荒谬的打印量来触发它,我怀疑你有很多文件加载.

无论如何,如果您对该System.out.println("Loading "+original+"...");行的意图是永久性/生产日志记录,而不是为了开发/调试目的而暂时放置代码,那么您最好使用正确的Logger.您可以在本SO答案中阅读TL; DR版本的说明,您可以通过其中提供的链接进一步阅读,包括官方文档.


另一个原因,当然是您的原因,就是您同时加载了太多数据.解决方案是:

  1. 缩小图像(制作缩略图),仅显示所选图像的完整版本.请注意,这是一种快速解决方法,不推荐!因为系统承受的可能性仍然太大.
  2. 只有在界面的可见部分出现图像(或所述图像的缩略图,用于组合的最佳解决方案),并在界面导航时加载新图像(并卸载其他图像).