У меня ошибка OutOfMemory при чтении изображений - PullRequest
2 голосов
/ 06 августа 2011

Хорошо, поэтому я читаю изображения в подкаталоге в файле .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 ]

1 голос
/ 06 августа 2011

Оптимизация / изменение размера / сжатие ваших изображений.Нет никакого способа, чтобы двенадцать PNG, представляющих простые шахматные фигуры в размерах для использования в игре, должны занимать достаточно места, чтобы вывести вас из памяти, даже при размерах кучи 32M или 64M.

0 голосов
/ 22 ноября 2011
Image.read() caches the image data in memory/disk. 

Ответили на похожий вопрос. Пожалуйста, проверьте здесь

0 голосов
/ 07 августа 2011

Лучший способ диагностировать OOM - это использовать профилировщик. JProfiler довольно хорошо, и я считаю, что у него есть бесплатный пробный период.

Также помните, что ООМ часто вводят в заблуждение. То, что OOM находится в одной конкретной строке, вовсе не означает, что эта строка использует много памяти; это просто строка, которая использовала последний бит доступной памяти. Например:

byte[] unused = new byte[availableMemory - 1];
byte[] reallyImportant = new byte[10]; // throws OutOfMemoryError
0 голосов
/ 06 августа 2011

Если вы знаете, что вы должны выполнять много операций ввода-вывода (т. Е. Читать целую кучу изображений), вы всегда можете увеличить общую кучу, потребляемую вашим Java-приложением.

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

java -Xms128m -Xmx256m YourClassNameHere

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

...