Как видно из названия. Я разработал класс, который должен показывать мне миниатюрные изображения из 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, чтобы увеличить кучу памяти, но я получаю ту же ошибку ...
Любая помощь ? Спасибо!