Vazamento de memória com Java?

8 respostas
A

Assunto: Sim! Você também pode conseguir algo parecido no java! Basta você querer!

Você pode ler este artigo na íntegra http://www.guj.com.br/java.artigo.106.1.guj
Por favor, coloque os seus comentários sobre este artigo aqui.

8 Respostas

F

Entao, mas no 1.o exemplo (pilha implementada com um vetor de objetos), mesmo havendo um memory leak, não é um memory leak tao grave assim. Imagine a situação:

  1. vc enche a pilha…
  2. vc esvazia a pilha…

ok, tds os objetos ainda estao com referencias validas, mas assim que a pilha começar a ser usada de novo, os objetos antigos terao suas referencias perdidas e serao removidos com o garbage collector!

Ou seja, se sua pilha for de tamanho 100, vc terá no maximo um leak de 100 objetos e que nunca serah maior que isso! E se vc fez uma pilha com esse tamanho, eh pq vc planejou o programa para rodar bem mesmo qdo a pilha estiver cheia!

Ahuaha… falei demais, mas resumindo td… depois q vc enche a pilha uma vez, ela passa a ocupar sempre os 100 objetos na memoria, mesmo que vc tenha chamado pop ateh esvazia-la! Mas tb o leak nunca será maior q isso! E conforme a pilha enche de novo, os objetos antigos vao sendo “naturalmente desalocados”…

Paulo_Silveira

sim

devia ter deixado isso mais claro
mas voce tem muitos aplicativos que variam muito o tamanho da pilha! mudancas gigantescas

entao se voce usou uma vez com 10000, e ai passou a usar em media 20, ja era! um abraco!

e imagine que voce tem VARIAS pilhas! e voce tem esse tipo de erro em VARIOS lugares! esse fine tuning em java eh importante, e ele eh facil! entao nao devemos descosiderar!

F

Sim eh verdade nao devemos desconsiderar…

urubatan

concordo, mas o artigo mostra um possivel erro de programação, e não um erro do GC, o GC diz que elimina da memoria tudo o que não for mais acessivel ao programa, e em todos os exemplos do artigo, as variaveis continuavam acessiveis ao programa.

caso aquela posição do “Stack” fosse utilizada novamente o objeto antigo seria liberado da memoria

ou então se existisse um prev ou algo assim para incrementar novamente a variavel, os objetos seriam acessados novamente

se alguem achar que isto é realmente um erro do GC, para corrigilo, basta colocar uma interface de adivinhação nele para ele saber que você ainda guarda uma referencia para a variavel, mas você não quer mais utiliza-la :slight_smile:

Rafael_Steil

Mas vale lembrar que memory leak eh de fato erro de programacao.

Rafael

urubatan

com certeza :slight_smile:
coloquei o reply hoje pois passei uma meia hora mais ou menos provando para um amigo meu fanatico por .NET e fervoroso odiador do Java que o artigo não se tratava de um erro do GC e sim de como evitar um provavel erro de programação

no final ele concordou comigo, mas ele mandou a mesma mensagem para um monte de gente dizendo que o artigo se tratava de um BUG no GC do Java, o que não é verdade :slight_smile:

M

Ué paulo,

o médoto pop da classe StackSimplerrima está errado e vc apresenta a correção logo em seguida.

pop() está retornando uma referência a um objeto da pilha sem retirá-la de lá. Errado para o método pop() de manipulação de pilhas, mas de acordo com as regras da linguagem ( objetos são passados por referência ).

Alias, na pilha só existem referências. Se outra parte do código estiver usando uma das referências de uma pilha que vc acabou de destruir, o GC não fará nada com esta referência e vc continuará usando normalmente.

Este tema de referências a objetos é muito legal e gostaria que as pessoas que acreditam que este comentário está errado, não tivessem pena apontar erros.

Atenciosamente,

M

Não ficou claro,

“este comentário está errado” se refere ao meu comentário e não o do paulo.

Atenciosamente,

Criado 11 de setembro de 2002
Ultima resposta 6 de jan. de 2003
Respostas 8
Participantes 6