带有动画GIF的JavaFX OutOfMemoryError

带有动画GIF的JavaFX OutOfMemoryError,java,javafx-2,out-of-memory,animated-gif,Java,Javafx 2,Out Of Memory,Animated Gif,我正在创建一个JavaFX2.0应用程序,该应用程序具有一个图像浏览器,当我在浏览多个GIF后遇到一些异常时,它应该能够显示动画GIF。我设法将相关代码隔离到一个“GifCrasher”应用程序中: import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import javafx.scene.image.Image; publi

我正在创建一个JavaFX2.0应用程序,该应用程序具有一个图像浏览器,当我在浏览多个GIF后遇到一些异常时,它应该能够显示动画GIF。我设法将相关代码隔离到一个“GifCrasher”应用程序中:

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;

import javafx.scene.image.Image;


public class GifCrash {

    // Settings:
    private static  long            waitTime    =   100;    // msec
    private static  ArrayList<File> imageFiles  =   new ArrayList<File>() {{
                                                    add(new File("thrillercat.gif"));
                                                }};

    // Other:
    private static  long    totalSize   =   0;
    private static  long    gifsLoaded  =   0;

    public static void main(String[] args) throws Exception {

        while(!Thread.currentThread().isInterrupted()) {
            // Read gif file:
            File        imageFile   =   GifCrash.imageFiles.get((int) (GifCrash.gifsLoaded % GifCrash.imageFiles.size()));
            InputStream iStream     =   new FileInputStream(imageFile);
            Image       image       =   new Image(iStream);
            iStream.close();

            // Display info:
            GifCrash.gifsLoaded++;
            GifCrash.totalSize += imageFile.length();
            System.out.println("Loaded " + imageFile + " (" + imageFile.length() + " bytes)");
            System.out.println("GifCount\t=\t" + GifCrash.gifsLoaded);
            System.out.println("TotalSize\t=\t" + Math.round((double) GifCrash.totalSize / (1024 * 1024)) + " MBytes (" + GifCrash.totalSize + " bytes)");
            System.out.println();

            // Wait?
            if (GifCrash.waitTime > 0) {
                Thread.sleep(GifCrash.waitTime);
            }
        }
    }
}
像往常一样,我假设这是由于我的代码中的一些错误而不是一个bug,那么我在这里做错了什么呢

如果这是一个bug,有没有办法解决它?i、 e.我需要能够在JavaFX窗口中显示大量动画GIF(一次只能看到一个GIF)

谢谢

只要使用,您的示例程序就可以使用Java 8版本

我在Java 7u45(OS X 10.8)(MacBook Air 2012,4gb ram)上尝试了这个示例程序,经过71次迭代后,它的内存始终不足

而对于Java 8,程序在运行5000次迭代后从未耗尽内存:

Loaded /Users/lilyshard/dev/playfx/src/thriller-cat-o.gif (1203120 bytes)
GifCount    =   10000
TotalSize   =   11474 MBytes (12031200000 bytes)
我没有让您的程序在Java7U45上运行的变通方法,而且在Java8分支上进行的错误修复不太可能被移植到JavaFX2.2。有时,bug修复会在用户请求时通过JavaFX问题跟踪器进行后端口,但这种情况很少发生


我的猜测是,JavaFX2.2 gif加载器中存在一些错误,这些错误已在准备Java 8发行版时修复。

谢谢您的回答!嗯,这很不幸,我会等到Java8成为当前版本。
Loaded /Users/lilyshard/dev/playfx/src/thriller-cat-o.gif (1203120 bytes)
GifCount    =   10000
TotalSize   =   11474 MBytes (12031200000 bytes)