OutOfMemoryError ao carregar imagens do banco

2 respostas
J

Estou desenvolvendo um software de descrição de objetos geológicos que utiliza uma linguagem visual (icônica) para suprir a falta de vocabulário da área. Tenho que carregar uns 60 ícones do BD.

Os ícones tem entre 20 e 250kb, sendo que a média fica em torno de 70kb.

Estou recuperando os ícones com o código abaixo (é um teste, então ignorem a falta de tratamento de exceções adequado)

\\Monto a query antes e armazeno em strQuery
PreparedStatement pstmt = connKnow.prepareStatement(strQuery);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
BufferedImage icon = null;
try 
{
      icon = ImageIO.read(rs.getBlob(ICON).getBinaryStream());
} 
catch (IOException ex) 
{
      ex.printStackTrace();
}

No entanto, está dando o seguinte erro:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:58)
        at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:397)
        at java.awt.image.Raster.createWritableRaster(Raster.java:938)
        at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1056)
        at javax.imageio.ImageReader.getDestination(ImageReader.java:2879)
        at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1260)
        at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1499)
        at javax.imageio.ImageIO.read(ImageIO.java:1422)
        at javax.imageio.ImageIO.read(ImageIO.java:1326)
       //Logo em seguida, o trace aponta para a linha em que eu recupero o ícone

Alguém sabe como posso contronar este problema?

2 Respostas

thiagocg

Se tua aplicação for web provavelmente vc precise aumentar a qtd de memoria disponivel na inicialização do seu jboss, tomcat, glassfish… isto vc encontra facilmente na web.
Mas se for dektop, vc precisa setar as variaveis de ambiente para inicialização da virtual machine (vm).

Creio q vc pode iniciar suas pesquisas baseados nestas opções.

Mas para te ajudar melhor seria interessante vc especificar mais sobre a arquitetura da aplicação.

[]'s

peczenyj

rode usando algum profiller e veja se vc tem consumo excessivo de memoria em algum ponto. isso pode ser reflexo de algum vazamento de memoria ou mesmo alguma configuração errada da jvm

Criado 7 de junho de 2010
Ultima resposta 7 de jun. de 2010
Respostas 2
Participantes 3