OutOfMemory Error

Tenho um projeto que carrega imagens TIFF, mas antes disso ele precisa converter o file para bytes[]…eu utilizo o codigo

[code] File file = new File(path + “.tif”);

byte [][] images = new byte[1][];
 
FileInputStream fis = new FileInputStream(file);
FileChannel fc = fis.getChannel();
long len = fc.size();
if (len > Integer.MAX_VALUE)
     throw new Exception("The file is too big");
byte[] dataFile = new byte[(int)len];
ByteBuffer bb = ByteBuffer.wrap(dataFile);
fc.read(bb);

images[0] = dataFile;[/code]

Acontece que quando o tive ultrapassa ± 50 megas, da erro de memória quando ele esta na linhas fc.read(bb);
ja aumentei a memoria com -Xmx512m -Xms512m…tem alguma forma de melhorar a perfomance ou tratar esse erro para não travar a aplicação?

Pergunta imbecil número um - o que ocorre se você NÃO usar NIO? O consumo de memória continua alto?

A unica coisa que eu preciso é do array de bytes da imagem, e não sei outra forma de fazer isso, aceito sugestões
Grato,

Escrevi o programa abaixo, e com ou sem NIO o consumo parece igual. (É o que deveria ser, mas sabe como é que é…)

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

class TesteFIS {
     public static void main(String[] args) throws IOException {
        // Primeiramente vamos criar um arquivo de 100 MB
        System.out.println ("Criando um arquivo de teste...");
        OutputStream os = new FileOutputStream ("teste.bin");
        int fileLength = 100 * 1024 * 1024;
        int blockCount = 1024;
        byte[] buf = new byte[fileLength / blockCount];
        for (int i = 0; i &lt blockCount; ++i) {
            os.write (buf);
        }
        os.close();
        buf = null;
        // Agora vamos medir a quantidade de memória. Vou usar "System.gc"
        // só para ter uma medida confiável.
        for (int i = 0; i &lt 10; ++i) {
            System.out.println ("Lendo o arquivo sem NIO");
            System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
            System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
            // Lendo o arquivo em memória só com FileInputStream
            InputStream is = new FileInputStream ("teste.bin");
            long m1 = Runtime.getRuntime().freeMemory();
            byte[] bytes = new byte [fileLength];
            is.read (bytes);
            is.close();
            System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
            System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
            long m2 = Runtime.getRuntime().freeMemory();
            System.out.println ("Diferença de memória: " + ((m1 - m2) / 1024) + " kbytes");
            bytes = null;
            // Lendo o arquivo em memória com NIO        
            System.out.println ("Lendo o arquivo com NIO");
            System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
            System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
            m1 = Runtime.getRuntime().freeMemory();
            FileInputStream fis = new FileInputStream("teste.bin");
            FileChannel fc = fis.getChannel();
            byte[] dataFile = new byte[fileLength];
            ByteBuffer bb = ByteBuffer.wrap(dataFile);
            fc.read(bb);
            fis.close();
            System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
            System.gc(); try { Thread.sleep (1000); } catch (InterruptedException ex) {}
            m2 = Runtime.getRuntime().freeMemory();
            System.out.println ("Diferença de memória: " + ((m1 - m2) / 1024) + " kbytes");
        }
     }
}

vlw thingol, vo testa aqui com o seu exemplo e depois eu comento…

engraçado uma coisa…se eu abro a imagem em algum visualizador, a imagem aparece corretamente…agora…no meu visualizador ela aparece espelhada! alguem ja teve esse problema???

O ponto 0,0 (origem das coordenadas) fica no canto superior esquerdo ou no campo inferior esquerdo?
Isso faz diferença, hein!

mas, onde que isso é passado para acontecer isso???

fica na parte superior esquerda…