Java.lang.OutOfMemoryError: Java heap space

7 respostas
J

Boa noite!
to com um probleminha aqui…
To desenvolvendo um Sistema de INformações, onde em algumas tabelas tenho que salvar a imagem (o professor recomendou que fosse gravado no BD), como fotografias e etc… para imagens pequenas funciona tranquilo, insere, recupera e etc, testei com imagens acima de 2mb, da esse pepino ai embaixo:
To utilizando Netbeans+Java+Hibernate+Postgre onde salvo os dados em bytea[], gostaria de saber se eh melhor salvar em bytea[] ou em Text?
caso text for melhor, alguem saberia como fazer um método pra conversao? ja procurei, mas nao nada!

Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2882)
        at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
        at java.lang.StringBuilder.append(StringBuilder.java:119)
        at java.util.AbstractMap.toString(AbstractMap.java:493)
        at org.hibernate.pretty.Printer.toString(Printer.java:59)
        at org.hibernate.pretty.Printer.toString(Printer.java:90)
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:97)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at sga.hibernate.configurations.GenericDAO.salvaOuAtualiza(GenericDAO.java:30)
        at sga.tela.panel.PanelButton.actionSave(PanelButton.java:185)
        at sga.tela.principais.JCadFotos$4.actionPerformed(JCadFotos.java:87)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)

eis meu método para conversao da imagem para byte:

public static byte[] imageToBytes(String inFile) {
        try {
            File file = new File(inFile);
            FileInputStream fis = new FileInputStream(file);
            byte[] bytes = new byte[(int) file.length()];
            fis.read(bytes);
            return bytes;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Imagem.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Imagem.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

7 Respostas

fabiomedeirosf

Olá!

Já usei o postgres pra armazenar imagens, o seu desempenho é realmente mto bom, surpreendeu-me.

Quanto ao problema de head space, este erro ocorre na recuperação da imagem do banco??

Somente cheguei a ter problemas com imagens superiores a 100mb.

Verifique se vc náo está trazendo uma lista, e consequentemente trazendo todas as imagens, ai pesaria mto mesmo, imagina 100 registros com 10mb cada, vc traria 1Gb pra memória… tem-se que tomar cuidado com isso…

O bytea do postgres eh o equivalente a oracle a campos do tipo Blob, use o bytea mesmo.

J

Opa, obrigado pela resposta, mas nao é na recuperação, sim na hora de salvar no BD…
Tenho um array do tipo List que preencho um JTable, e com base no cod que esta nesse Table eu recupero dentro do BD…
como ja tinha falado, o metodo funciona tranquilamente pra imagens pequenas 700k… quando coloco imagem de 2mb da pau!
mas meu método de conversão ta certo?

fabiomedeirosf

Por que seu método é estático?

a conversão está correta sim.

Mas em todo caso, pode aumentar o tamanho do heap usando a expressao:
java -Xmx512M

neste caso estamos aumentando o seu espaço de heape pra 512mb.

J

está estatico pq ta na classe “Utilitários”, pois nao vi vantagem de colocalo em outra classe…
meu Heap ta com 330 mb, antes tava com 64…
creio que nao é isso, até por que ele exibe a imagem no Label/JPanel e nao da pau na memoria

J

aumentei, continua a dar o mesmo problema!

J

que coisa estranha!
testei o mesmo projeto em uma outra maquina, funcionou, inseri uma imagem de 10mb e funcionou!
nao sei pq no meu not ta assim
aff

leonpoa

Bom dia jperondi,

Cara, estou com o mesmo problema, porém não estou trabalhando com imagens e sim com arquivos mesmo, estou utilizando um método para fazer a conversão bem semelhante ao seu, porém tenha arquivos de até 100MB para persistir no PostgreSQL.

Percebi que arquivos de até 40MB vai tranquilo, agora arquivos de 49,5MB pra cima tah dando esse erro…

Descobriu alguma coisa a mais?

Vlw!

Criado 25 de janeiro de 2011
Ultima resposta 12 de mar. de 2011
Respostas 7
Participantes 3