Использование MAT для сравнения / анализа дампов кучи

читал сотни статей о проблеме ООМ. Большинство из них касаются больших растровых изображений. Я делаю картографическое приложение, где мы загружаем256x256 Погода наложение плитки. Большинство из них абсолютно прозрачные и очень маленькие. Я только что получил сбой в потоке растрового изображения длиной 442 байта при вызовеBitmapFactory.decodeByteArray(....).

Исключение гласит:

java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=9415KB, Allocated=5192KB, Bitmap Size=23671KB)

Код:

protected Bitmap retrieveImageData() throws IOException {
    URL url = new URL(imageUrl);
    InputStream in = null;
    OutputStream out = null;
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

    // determine the image size and allocate a buffer
    int fileSize = connection.getContentLength();
    if (fileSize < 0) {
        return null;
    }
    byte[] imageData = new byte[fileSize];

    // download the file
    //Log.d(LOG_TAG, "fetching image " + imageUrl + " (" + fileSize + ")");
    BufferedInputStream istream = new BufferedInputStream(connection.getInputStream());
    int bytesRead = 0;
    int offset = 0;
    while (bytesRead != -1 && offset < fileSize) {
        bytesRead = istream.read(imageData, offset, fileSize - offset);
        offset += bytesRead;
    }

    // clean up
    istream.close();
    connection.disconnect();
    Bitmap bitmap = null;
    try {
        bitmap = BitmapFactory.decodeByteArray(imageData, 0, bytesRead);
    } catch (OutOfMemoryError e) {
        Log.e("Map", "Tile Loader (241) Out Of Memory Error " + e.getLocalizedMessage());
        System.gc();
    }
    return bitmap;

}

Вот что я вижу в отладчике:

bytesRead = 442

Таким образом, данные растрового изображения составляют 442 байта. Зачем пытаться создать растровое изображение размером 23671 КБ и не хватает памяти?

Ответы на вопрос(3)

Ваш ответ на вопрос