OutOfMemory Error

6 respostas
H
Tenho um projeto que carrega imagens TIFF, mas antes disso ele precisa converter o file para bytes[]....eu utilizo o codigo
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;

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?

6 Respostas

T

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

H

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,

T

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");
        }
     }
}
H

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???

T

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

H

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

fica na parte superior esquerda…

Criado 14 de março de 2007
Ultima resposta 15 de mar. de 2007
Respostas 6
Participantes 2