[RESOLVIDO] Memória - java.lang.OutOfMemoryError: Java heap space

Bom dia,

Estou trabalhando com manipulação de imagens, editando-as.

E no momento em que abro ou fecho a imagem, gera essa exception!

uma imagem de 1mb fica ocupando + de 128mb de memória do pc!

Só que necessito abrir imagens deste tamanho, fora utilizar o -Xmx, e o -Xms, teria algum jeito de resolver este problema?

Grato,
Jonathan Souza Santos
:smiley:

Mostra o código.

Pode ser que esteja alocando mais memória que o necessário em algum ponto.

Imagens, para serem manipuladas, devem ser descompactadas na memória. Por padrão, é o que o BufferedImage faz. Então, uma imagem, pode sim, ficar muito grande depois de aberta.

Em todo caso, seria bom usar o Visual VM para ver se a causa é realmente essa, ou se sua aplicação não está fazendo alguma caca.
https://visualvm.dev.java.net/

Use também o parâmetro da VM:
-XX:HeapDumpOnOutOfMemoryError

Para gerar um dump da sua memória antes do erro ocorrer. Esse dump pode ser aberto e analisado no Visual VM.

A idéia principal é que ela abre em +/- 240 mb…

Teria como ela não abrir em memória e sim apenas ser uma visualização dela ?

Um jeito de que ela não alocasse esses 240mb e sim apenas os 80 default do java?

Se eu pegar e adicionar os -Xmx512mb digamos, a aplicação roda normal, mas deixa ela usando 240 mb da memória não é nada util!!

Hehe

Se alguém souber uma resolução mais agradavel fora alocar mais memória?!

Valeu desde já,
Jonathan Souza Santos
:smiley:

Pode postar a imagem que está querendo carregar?

[quote=jonathanprogrammer]A idéia principal é que ela abre em +/- 240 mb…

Teria como ela não abrir em memória e sim apenas ser uma visualização dela ?

Um jeito de que ela não alocasse esses 240mb e sim apenas os 80 default do java?

Se eu pegar e adicionar os -Xmx512mb digamos, a aplicação roda normal, mas deixa ela usando 240 mb da memória não é nada util!!

Hehe

Se alguém souber uma resolução mais agradavel fora alocar mais memória?!

Valeu desde já,
Jonathan Souza Santos
:smiley: [/quote]

Tudo que você vê no monitor está carregado na ram convecional ou na ram da sua placa de vídeo.
A pilha do windows suporta 8 megas. Se você empilhou uma imagem maior que isso no heap já está errado.

Alguns tipos de imagens são em “tiles” (como o TIFF) e permitem que você edite apenas uma “tile” dela, ou seja, uma porção, não a imagem completa, para evitar esse tipo de problema (gastar uma quantidade excessiva de memória).

Veja os métodos do JAI.

[quote=juliocbq]Tudo que você vê no monitor está carregado na ram convecional ou na ram da sua placa de vídeo.
A pilha do windows suporta 8 megas. Se você empilhou uma imagem maior que isso no heap já está errado. [/quote]

A imagem é de 1mb mais ou menos, o programa não carrega mais de 2mb de imagem…

O problema é que ta sendo ocupado 240mb de ram pra executar a imagem! e com isso fica pesado o programa.

Gostaria apenas visualizar a imagem, sem usar 240mb…
:smiley:

[quote=entanglement]Alguns tipos de imagens são em “tiles” (como o TIFF) e permitem que você edite apenas uma “tile” dela, ou seja, uma porção, não a imagem completa, para evitar esse tipo de problema (gastar uma quantidade excessiva de memória).

Veja os métodos do JAI. [/quote]

Na real a edição eu deixaria mais pra frente, a necessidade principal é abri um imagem e visualizar ela sem ocupar 240mb de memoria…

[quote=jonathanprogrammer][quote=entanglement]Alguns tipos de imagens são em “tiles” (como o TIFF) e permitem que você edite apenas uma “tile” dela, ou seja, uma porção, não a imagem completa, para evitar esse tipo de problema (gastar uma quantidade excessiva de memória).

Veja os métodos do JAI. [/quote]

Na real a edição eu deixaria mais pra frente, a necessidade principal é abri um imagem e visualizar ela sem ocupar 240mb de memoria…[/quote]

Posta a imagem e o código pra vermos.

Dica: use um programa (como o ImageMagick, que tem interfaces em Java para você usar) que pegue a tal imagem e a converta para uma imagem menor, que você possa carregar sem estourar sua memória.

Para carregar uma imagem em algum formato de compressão, vc precisa decodifica-la, e da mesma forma vai ocupar memoria.
Sem ver o código não dá para ajudar.

Hmm…

o código não adianta eu te postar, senão vo posta muitas linhas :roll:

Mais se tu poder me dar uma referência teorica onde eu possa aplicar o que vocês estão me falando, fora as API que já mencionaram!

Valeu,
:smiley:

É assim.

Digamos que você queira editar uma imagem gerada por uma câmera digital de 12 megapixels, ou seja, essa imagem deve ocupar 12 * 1000000 * 4 bytes = 48 Megabytes em memória se você usar 32 bits por pixel (o que não é tão impossível assim - vários formatos usam exatamente esse layout).

Normalmente você não carrega a imagem inteira na memória FÍSICA, e sim cria uma espécie de “memória virtual” onde só uma subimagem dessa imagem total é que fica presente na memória.

Para fazer esse tipo de coisas, você precisa de uma biblioteca poderosa, normalmente fornecida por terceiros e que costuma funcionar melhor com outras linguagens, não Java.

Se você, em vez disso, quiser fazer tudo isso do zero e sem pagar um tostão, precisa pelo menos usar uma biblioteca como a JAI - a Java ImageIO não é suficiente para o que você quer. No FAQ do JAI eles indicam o que fazer com imagens grandes.

http://java.sun.com/products/java-media/jai/forDevelopers/jaifaq.html#largeimages

Que tal dar uma lida em alguns links que

[quote=jonathanprogrammer]
o código não adianta eu te postar, senão vo posta muitas linhas :roll: [/quote]

Logo abaixo da caixa de textos onde você escreve a resposta, tem a opção “Attachments”. Isso significa “anexos”.

[quote=ViniGodoy][quote=jonathanprogrammer]
o código não adianta eu te postar, senão vo posta muitas linhas :roll: [/quote]

Logo abaixo da caixa de textos onde você escreve a resposta, tem a opção “Attachments”. Isso significa “anexos”.[/quote]

O problema é que é muitas interfaces e classes envolvidas, dai é uma mão posta tudo, e o projeto é da empresa.
:frowning:

[quote=jonathanprogrammer]Hmm…

o código não adianta eu te postar, senão vo posta muitas linhas :roll:

Mais se tu poder me dar uma referência teorica onde eu possa aplicar o que vocês estão me falando, fora as API que já mencionaram!

Valeu,
:smiley: [/quote]

O seu código está errado. Eu processo imagens de 8 mb/px usando filtros complexos em menos de 1s com java. E uma imagem de 8mbpx possui mais de 2000px de largura e altura.

[quote=jonathanprogrammer][quote=ViniGodoy][quote=jonathanprogrammer]
o código não adianta eu te postar, senão vo posta muitas linhas :roll: [/quote]

Logo abaixo da caixa de textos onde você escreve a resposta, tem a opção “Attachments”. Isso significa “anexos”.[/quote]

O problema é que é muitas interfaces e classes envolvidas, dai é uma mão posta tudo, e o projeto é da empresa.
:frowning: [/quote]

Posta somente o código que carrega a imagem, bixo. Tô careca de mexer com isso no meu trabalho. Vc não vai estar me dando nada.

fui…

Não é questão de tu roubar ou não nada, entrei hoje na empresa, e ja me mandaram ver isso, não manjo bem de manipulação de images…

E se verem que eu to mandando código da empresa… sla… meio chato bixo…

E tu não tem nenhum exemplo ai pra me mandar pra ver?!

:smiley: