java .lang.OutOfMemoryError: Java куча места при отображении миниатюр изображений из JFileChooser - PullRequest
0 голосов
/ 26 января 2020

Как видно из названия. Я разработал класс, который должен показывать мне миниатюрные изображения из JFileChooser.

Класс работает нормально, но когда ему нужно показать несколько значков изображений, я получаю ошибку:

Exception in thread "Image Fetcher 3" java.lang.OutOfMemoryError: Java heap space
    at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:75)
    at java.awt.image.Raster.createPackedRaster(Raster.java:467)
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1032)
    at sun.awt.image.ImageRepresentation.createBufferedImage(ImageRepresentation.java:253)
    at sun.awt.image.ImageRepresentation.setPixels(ImageRepresentation.java:559)
    at sun.awt.image.ImageDecoder.setPixels(ImageDecoder.java:138)
    at sun.awt.image.PNGImageDecoder.sendPixels(PNGImageDecoder.java:549)
    at sun.awt.image.PNGImageDecoder.produceImage(PNGImageDecoder.java:470)
    at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:269)
    at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:205)
    at sun.awt.image.ImageFetcher.run(ImageFetcher.java:169)

Это код моего класса, который я выполняю этой функцией. Я использую сборщик мусора, чтобы сохранить изображения в кеше для лучшей производительности ..

public class ThumbNailView extends FileView {

    private JComponent component;
    private final ExecutorService executor = Executors.newCachedThreadPool();
    private final Pattern imageFilePattern = Pattern.compile(".+?\\.(png|jpg|bmp|jpe?g|gif|tiff?)$", Pattern.CASE_INSENSITIVE);

    /** Use a weak hash map to cache images until the next garbage collection (saves memory) */
    private final Map imageCache = new WeakHashMap();

    private static final int ICON_SIZE = 16;

    private static final Image LOADING_IMAGE = new BufferedImage(ICON_SIZE, ICON_SIZE, BufferedImage.TYPE_INT_ARGB);

    public void setComponent(JComponent component){
        this.component = component;
    }

    public Icon getIcon(File file) {
            if (!imageFilePattern.matcher(file.getName()).matches()) {
                return null;
            }

            // Cache browsing
            synchronized (imageCache) {
                ImageIcon icon = (ImageIcon) imageCache.get(file);

                if (icon == null) {
                    // Create a new icon with the default image
                    icon = new ImageIcon(LOADING_IMAGE);

                    // Add to the cache
                    imageCache.put(file, icon);

                    // Submit a new task to load the image and update the icon
                    executor.submit(new ThumbnailIconLoader(icon, file));
                }

                return icon;
            }
        }

    private class ThumbnailIconLoader implements Runnable {
        private final ImageIcon icon;
        private final File file;

        public ThumbnailIconLoader(ImageIcon i, File f) {
            icon = i;
            file = f;
        }

        public void run() {

            // Load and scale the image down, then replace the icon's old image with the new one.
            ImageIcon newIcon = new ImageIcon(file.getAbsolutePath());
            Image img = newIcon.getImage().getScaledInstance(ICON_SIZE, ICON_SIZE, Image.SCALE_SMOOTH);
            icon.setImage(img);

            // Repaint the dialog so we see the new icon.
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    component.repaint();
                }
            });
        }
    }
}

Я знаю, проблема в том, что у меня не хватает кучи, но я попытался реализовать эту строку в my netbeans.conf:

netbeans_default_options="-J-Xms512m -J-Xmx512m -J-XX:PermSize=32m -J-XX:MaxPermSize=512m -J-Xverify:none

Как и на этой странице http://javahowto.blogspot.com/2006/06/6-common-errors-in-setting-java-heap.html, чтобы увеличить кучу памяти, но я получаю ту же ошибку ...

Любая помощь ? Спасибо!

...