OutOfMemoryError: JavaHeapSpace

7 respostas
Vinicius_Zibetti_Res

Galera, estou com um probleminha aqui.
Eu estou usando uma LinkedList, para realizar uma Especie de Ctrol-Z ( Undo ), e cada estado do atual antes de modificacoes, ele salva uma BufferedImage dentro dessa lista, mas quando passa de 130 elementos, da esse erro aqui:

Exception in thread “AWT-EventQueue-0” java.lang.OutOfMemoryError: Java heap space

at java.awt.image.DataBufferInt.<init>(Unknown Source)

at java.awt.image.SinglePixelPackedSampleModel.createDataBuffer(Unknown Source)

at java.awt.image.Raster.createWritableRaster(Unknown Source)

at java.awt.image.BufferedImage.getData(Unknown Source)

at java.awt.image.BufferedImage.copyData(Unknown Source)

at com.br.desenhos.view.Panel.deepCopy(Panel.java:105)

at com.br.desenhos.view.Screen$17.mouseReleased(Screen.java:404)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEventImpl(Unknown Source)

at java.awt.EventQueue.access$000(Unknown Source)

at java.awt.EventQueue$3.run(Unknown Source)

at java.awt.EventQueue$3.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue$4.run(Unknown Source)

at java.awt.EventQueue$4.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

Alguem tem ideia de como resolver esse problema, ou realizar um Ctrol-Z mais eficiente ?

7 Respostas

rafael_souza0

Cara, nao sei se vai ajudar, mas se sua aplicação for Web e estiver usando o tomcat vc pode tentar aumentar a memoria inicial da JVM

Vá no Run Configuration e na guia 'VM Arguments’
provavelmente vc ira verificar um conteudo da configuracao de diretorios do tomcat (este arquivo vc pode localizar em service.bat localizado no diretório bin/ )
daí neste conteúdo, vc irá adicionar o seguinte:

-Xms256m ou -Xmx512m ou os dois juntos(-Xms256m -Xmx512m)

Isso configura a memória utilizada pelo web container que sera passado para a jvm no momento do startup do servidor.

Xms é alocação inicial de memória e Xmx a alocação máxima de memória, e ambos devem ser multiplos de 1024.

Nao sei se outro servidor funciona, mas no tomcat é certeza pq ja passei por esse problema de memoria.

E

outros containers também funcionam. Mas a impressão que tenho é que ele está usando SWT.

Vou dar algumas sugestões:

  1. Coloca um tamanho limite no LinkedList
  2. Serializa LinkedList’s em disco quando chegar nesse tamanho

Se me lembro bem o tamanho padrão do Xmx é 256m, 256m em uma aplicação desktop é muito, tenta dar uma enxugada nisso.

maior_abandonado

você precisa mesmo guardar mais de 100 estados anteriores?

pode passar xms e xmx para configurar memoria inicial e máxima que sua aplicação utiliza e se for o caso como o o colega ai disse você pode serializar isso no disco (não esquece de deixar este arquivo temporário, de repente cria ele com um objeto File e chama o método deleteOnExit, a menos que você queira que o arquivo permaneça la).

Alexandre_Saudate

Repito o questionamento do maior_abandonado : Precisa mesmo guardar tantos estados? Sugiro trocar isso por um Deque (FIFO) e ir descartando estados disso aí. Além disso, provavelmente suas BufferedImages estão tomando muito espaço. Sugiro tentar trocar por uma estrutura de dados um pouco mais leve, também (por exemplo, somente o que muda de uma imagem pra outra e, quando solicitado, reaver esses dados e re-renderizar a imagem).

[]'s

Vinicius_Zibetti_Res

Ola gente, eu li os posts de todos.

É uma aplicação Desktop com Java SE.

Eu armazeno a cada alteração feita na imagem ( Cada ves que o usuario faz alguma ação que mova algum pixel na imagem ), uma nova BufferedReader…

Eu tentei criar minha propria lista duplamente encadeada (inteira O(1)) aqui que recebe direto a bufferedReader mas continua dando erro quando chega em 130 elementos e OutOfMemory: JavaHeapSpace…

Eu nao entendi muito bem esse negocio ai de serializar em disco, como funciona, pra que serve e como uso ? e como eu faria asaudate, para fazer isto que disse (não ficou muito claro o que voce tentou explicar) ?

Eu necessito de guardar pelo menos uns 240 estados anteriores, no minimo…

E é verdade uma aplicação consumir mais de 240mb é fogo, eu testei aqui, ta consumindo uma memória absurda mesmo

Por favor me ajudem gente de verdade não sei muito o que fazer, obrigado a todos.

E

O que o asaudate quis dizer, é que ao invés de você armazenar 1 BufferedImage para cada alteração que o usuário faz na imagem, você grava o que foi alterado somente. Por exemplo, o usuário adiciona um risco na imagem, ao invés de você gravar a nova imagem, você grava somente o risco que ele adicionou. Com isso você armazena menos MB na memória.

E sobre serializar, seria você gravar cada uma das alterações (ou das BufferedImage, como você preferir) em disco, com isso você não precisaria ter todos esses objetos na memória, quando fosse dar um “control + z” você somente iria ler no disco. Procura estudar a Interface Serializable e veja como pode guardar isso em disco. (se não me engano, também tem uma Externalizable, mas nunca usei)

FernandoFranzini
Criado 14 de dezembro de 2011
Ultima resposta 19 de dez. de 2011
Respostas 7
Participantes 6