Java.lang.OutOfMemoryError: Java heap space[resolvido]

As documentações do Java 2D tem recomendado usar o ImageIO.read para carregar um BufferedImage, e não mais o Toolkit. A gerência do BufferedImage costuma a ser mais eficiente (pelo menos é o que dizem, nunca rodei nada para testar, mas não tem pq desconfiar da própria Sun).

[quote=juliocbq][quote=CarlosEduardoDantas][quote=ViniGodoy]Heheheh, pois é. Mas ele é muito confiável.
Se as imagens estão ficando presas, é porque algo as referencia.[/quote]

Vini, só para constar. Eu não questionei a confiabilidade do coletor, mas conheço o processo e sei que ele não vai coletar algo que você não descarta. Isto é falha do sistema.[/quote]

Pode me explicar como descartar o objeto BufferedImage?
O que vou tentar fazer agora, é passar null pera ele, assim não terá mais referência na memória, e o coletor deverá fazer a coleta.[/quote]

eu não tinha visto teu código acima… mas tenta usar o que o colega abaixo postou e nos notifique dos resultados

boa sorte :wink:

[quote=CarlosEduardoDantas][quote=juliocbq][quote=CarlosEduardoDantas][quote=ViniGodoy]Heheheh, pois é. Mas ele é muito confiável.
Se as imagens estão ficando presas, é porque algo as referencia.[/quote]

Vini, só para constar. Eu não questionei a confiabilidade do coletor, mas conheço o processo e sei que ele não vai coletar algo que você não descarta. Isto é falha do sistema.[/quote]

Pode me explicar como descartar o objeto BufferedImage?
O que vou tentar fazer agora, é passar null pera ele, assim não terá mais referência na memória, e o coletor deverá fazer a coleta.[/quote]

eu não tinha visto teu código acima… mas tenta usar o que o colega abaixo postou e nos notifique dos resultados

boa sorte :wink: [/quote]

estou constantemente online. Daqui a pouco posto os resultados do teste.

[quote=juliocbq]Pode me explicar como descartar o objeto BufferedImage?
O que vou tentar fazer agora, é passar null pera ele, assim não terá mais referência na memória, e o coletor deverá fazer a coleta.[/quote]

Vai passar null para quem?
Geralmente, são poucas vezes que você deve fazer = null explicitamente. Exceto se você tiver guardado imagens num vetor, ou em atributos que não sairão de escopo. Mas não parece ser o seu caso…

Me lembro que no livro Effective Java, o autor falava sobre esse tipo de problema. Se eu não me engano, o exemplo dele era uma lista que ele guardava objetos, mas usava uma variavel inteira para apontar o final da lista. Então o problema era que, quando se removia elementos, a variavel regredia o valor, mas não era exluído da lista, ou seja, o objeto sempre tinha referencias e nunca era recolhido pelo GC (é melhor olhar o livro porque eu não lembro muito bem não hehehe). Você podia ver se não tem algum problema parecido no seu código, onde a referencia a seus objetos são guardados em algum lugar e são esquecidos lá.

[quote=ViniGodoy][quote=juliocbq]Pode me explicar como descartar o objeto BufferedImage?
O que vou tentar fazer agora, é passar null pera ele, assim não terá mais referência na memória, e o coletor deverá fazer a coleta.[/quote]

Vai passar null para quem?
Geralmente, são poucas vezes que você deve fazer = null explicitamente. Exceto se você tiver guardado imagens num vetor, ou em atributos que não sairão de escopo. Mas não parece ser o seu caso…[/quote]

Normalmente, passar null para um objeto faz com que o coletor de lixo o enxergue. Eu usei o metodo flush, no final de cada decodificação, e deixei o software rodando. Vamos ver se vai estourar o heap.

Outra idéia para usar referências é usar as classes de java.lang.ref, e trabalhar com seus vários níveis de referências.

As referências mais fracas são usadas para objetos que você gostaria que estivessem em memória, mas podem ser recolhidos caso o sistema precisar de memória.

O estouro voltou a acontecer, mas dessa vez não foi dentro de BufferedImage. Recebi apenas essa exceção. Vou tentar otimizar o código ao máximo, de acordo com as idéias do vinnie. Utilizarei o profile, e trocarei toolkit por ImageIO

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

Deixarei o software rodando a noite, e amanhã terei mais novidades.

Obrigado a todos pela ajuda…

Que dureza pessoal. O problema do heap eu consegui resolver. Mas o software agora congela por causa do coletor de lixo algumas vezes.
Alguém ae sabe como consigo liberar da memória de um vetor de bytes?
byte[].

Obrigado a todos pelos posts.