我在阅读图像时出现OutOfMemory错误

时间:2011-08-06 03:15:38

标签: java jar inputstream out-of-memory javax.imageio

好吧,所以我正在读取.jar文件中名为'images'的子目录中的图像,当然我必须通过流访问它们,因为它在.jar中。这就是读取图像的内容:

    private Image wPawn = getImage(getClass().getResourceAsStream("images/WhitePawn.png")),
        bPawn = getImage(getClass().getResourceAsStream("images/BlackPawn.png")),
        wRook = getImage(getClass().getResourceAsStream("images/WhiteRook.png")),
        bRook = getImage(getClass().getResourceAsStream("images/BlackRook.png")),
        wKnight = getImage(getClass().getResourceAsStream("images/WhiteKnight.png")),
        bKnight = getImage(getClass().getResourceAsStream("images/BlackKnight.png")),
        wBishop = getImage(getClass().getResourceAsStream("images/WhiteBishop.png")),
        bBishop = getImage(getClass().getResourceAsStream("images/BlackBishop.png")),
        wQueen = getImage(getClass().getResourceAsStream("images/WhiteQueen.png")),
        bQueen = getImage(getClass().getResourceAsStream("images/BlackQueen.png")),
        wKing = getImage(getClass().getResourceAsStream("images/WhiteKing.png")),
        bKing = getImage(getClass().getResourceAsStream("images/BlackKing.png"));
private Image getImage(InputStream stream){
    Image i;
    try{
        i = ImageIO.read(stream);
        stream.close();
    } catch (IOException e) {
        i = null;
    }
    return i;
}

这段代码可行,但是我的鼠标输入完全落后于国际象棋游戏。以前,我有一个小的单独的类做同样的工作,但它没有导致OutOfMemoryError。

错误来自i = ImageIO.read(stream); 行,并从图像声明中调用。任何人都可以帮助找出解决错误的最佳方法吗?

4 个答案:

答案 0 :(得分:1)

优化/调整/压缩图像。如果在游戏中使用的尺寸只有12个简单棋子的PNG就不会占用足够的空间来运行你的内存,即使是32M或64M的堆大小。

答案 1 :(得分:0)

如果您知道必须执行大量IO(即读取大量图像),则可以始终增加Java应用程序消耗的总堆。

这样做的例子如下:

  

java -Xms128m -Xmx256m YourClassNameHere

除非您知道无法解决问题,否则在问题上投入更多资源绝不是解决方案。在优化了解决方案并确保没有浪费内存并且应用程序确实需要使用额外内存之后,我会将此解决方案作为最后的手段。

答案 2 :(得分:0)

诊断OOM的最佳方法是使用分析器。 JProfiler非常好,我相信它有免费试用期。

另外,请记住,OOM经常会产生误导。仅仅因为OOM被抛到一个特定的行并不意味着这就是使用大量内存的行;它只是使用可用内存的 last 位的行。例如:

byte[] unused = new byte[availableMemory - 1];
byte[] reallyImportant = new byte[10]; // throws OutOfMemoryError

答案 3 :(得分:0)

Image.read() caches the image data in memory/disk. 

回答了类似的问题。 Please Check here