Objetos em Java

9 respostas
H

Pessoal,

Minha duvida é meio simples ,no entanto foi motivo de controversia entre alguns colegas,principalmente quanto a destruição de objetos,que eu achava que poderia ser implementada com uma chamada de System.gc() mas meu colega disse que uma chamada de Garbage Colector explicita como esta ,na verdade, constitue uma thread de baixa prioridade,que só seria executada quando o processador estivesse ocioso,o que não garante que limpe imeditamente o espaço de memoria quando chamado.

Em suma,minhas duvidas são:
1-Como posso criar um array de objetos meus ?Digamos que meu objeto é de uma classe ClasseDoHumberto,como criar um array de objetos dessa classe.?Digamos 1000 objetos…

2-Depois que eu instanciar um objeto da ClasseDoHumberto,e realizar as operações dela queria antes de chamar o outro objeto ,liberar o espaço de memoria do primeiro objeto,ou seja ,como destruo um objeto previamente instanciado?

Num tutorial na internet eu vi menção a um comando “delete” pra limpar da memoria um objeto mas não vi referencia ao mesmo na API…

Obrigado,


9 Respostas

S

você não destroi um objeto , vc pode setar a referência que o “aponta” para null, e isso o torna elegível para a coleta do garbage collector que SE FOR EXECUTADO ai o objeto vai ser coletado…

para criar um array:
ClasseDoHumberto [] array = new ClasseDoHumberto[1000];

H

“Samuel_Pessorrusso”:
“HumbertoJr”:

Em suma,minhas duvidas são:
1-Como posso criar um array de objetos meus ?Digamos que meu objeto é de uma classe ClasseDoHumberto,como criar um array de objetos dessa classe.?Digamos 1000 objetos…

2-Depois que eu instanciar um objeto da ClasseDoHumberto,e realizar as operações dela queria antes de chamar o outro objeto ,liberar o espaço de memoria do primeiro objeto,ou seja ,como destruo um objeto previamente instanciado?

você não destroi um objeto , vc pode setar a referência que o “aponta” para null, e isso o torna elegível para a coleta do garbage collector que SE FOR EXECUTADO ai o objeto vai ser coletado…

para criar um array:
ClasseDoHumberto [] array = new ClasseDoHumberto[1000];

Acho que me expressei mal,eu gostaria que depois que fosse feito a operação acima que vc colocou(declaração do array) ,fizesse um looo no qual eu fizesse referencia para um objeto do array da minha classe só depois que o anterior fosse limpo da memoria,ou seja não quero é os objetos todos em memoria simultaneamente…

Mas obrigado mesmo!

H

“Samuel_Pessorrusso”:
“HumbertoJr”:

Em suma,minhas duvidas são:
1-Como posso criar um array de objetos meus ?Digamos que meu objeto é de uma classe ClasseDoHumberto,como criar um array de objetos dessa classe.?Digamos 1000 objetos…

2-Depois que eu instanciar um objeto da ClasseDoHumberto,e realizar as operações dela queria antes de chamar o outro objeto ,liberar o espaço de memoria do primeiro objeto,ou seja ,como destruo um objeto previamente instanciado?

você não destroi um objeto , vc pode setar a referência que o “aponta” para null, e isso o torna elegível para a coleta do garbage collector que SE FOR EXECUTADO ai o objeto vai ser coletado…

para criar um array:
ClasseDoHumberto [] array = new ClasseDoHumberto[1000];

Acho que me expressei mal,eu gostaria que depois que fosse feito a operação acima que vc colocou(declaração do array) ,fizesse um looo no qual eu fizesse referencia para um objeto do array da minha classe só depois que o anterior fosse limpo da memoria,ou seja não quero é os objetos todos em memoria simultaneamente…

Mas obrigado mesmo!

S

toda vez que um objeto é “coletado” pelo garbage collector, o GC chama o método finalize deste objeto…
vc pode tentar fazer algo neste método… para instanciar um novo objeto…

Mas veja bem, o método finalize só é chamado quando o objeto é coletado pelo garbage collector, e como não existem garantiar que o GC irá coletar um objeto, então não dá para saber com certeza para qual objeto o método finalize vai ou não ser chamado.

V

Assim:

ClasseDoHumberto array =  new ClasseDoHumberto[1000];

   for(int i = 0 ; i < array.lenght; i++){
      array[i] = new ClasseDoHumberto();
   }
H
"vinci":
"HumbertoJr":
1-Como posso criar um array de objetos meus ?Digamos que meu objeto é de uma classe ClasseDoHumberto,como criar um array de objetos dessa classe.?Digamos 1000 objetos.......

Assim:

ClasseDoHumberto array =  new ClasseDoHumberto[1000];

   for(int i = 0 ; i < array.lenght; i++){
      array[i] = new ClasseDoHumberto();
   }

Se eu fizer isso(do teu codigo acima) vai haver um momento em que varios objetos meus estarão ao MESMO tempo ocupandp espaço na memoria.......é exatamente o que eu Nâo quero!

V

Refatorando…

ClasseDoHumberto objeto = null; 

   for(int i = 0 ; i < 1000; i++){
      objeto = new ClasseDoHumberto();    
  
      objeto.fazUmaCoisa();
      objeto.fazOutraCoisa();
      objeto.fazAUltimaCoisa();
   }

Os objetos serão criados, ao final do laço estarão “desapondados”, e à medida que isso ocupar muita memória, o coletor de lixo vai resolver isso numa boa. Se você não quer que dois objetos estejam na memória ao mesmo tempo apenas por eficiência, essa solução é rasoável. Agora, se existem outras implicações lógicas, acho que vai ter que detalhar mais…

Obs: Tenho a impressão que isso ainda não é o que voce quer… :???:

F

“vinci”:
Refatorando…

ClasseDoHumberto objeto = null; 

   for(int i = 0 ; i < 1000; i++){
      objeto = new ClasseDoHumberto();    
  
      objeto.fazUmaCoisa();
      objeto.fazOutraCoisa();
      objeto.fazAUltimaCoisa();
   }

Os objetos serão criados, ao final do laço estarão “desapondados”, e à medida que isso ocupar muita memória, o coletor de lixo vai resolver isso numa boa. Se você não quer que dois objetos estejam na memória ao mesmo tempo apenas por eficiência, essa solução é rasoável. Agora, se existem outras implicações lógicas, acho que vai ter que detalhar mais…

Obs: Tenho a impressão que isso ainda não é o que voce quer… :???:

pra n ficar com dois objetos ao mesmo tempo na memoria eh soh mudar pra isso:

ClasseDoHumberto objeto = null;

   for(int i = 0 ; i < 1000; i++){
      objeto = new ClasseDoHumberto();   
 
      objeto.fazUmaCoisa();
      objeto.fazOutraCoisa();
      objeto.fazAUltimaCoisa();
      System.gc();
   }

se vc n chamar o System.gc(), os objetos soh serao finalizados apos q o metodo terminar e o procissador ficar ocioso, jah teve programas q eu fiz de forma parecida e sem chamar o System.gc() dava erro por falta de memoria, mas chamar o System.gc() para TODOS os objetos tb eh exagero (a nao ser q a classe ocupe MUITA memoria), e vai acabar comprometendo o processamento, vc pode por um loop interno e chamar o System.gc() soh apos um certo numero de vezes, ex:

ClasseDoHumberto objeto = null;

   for(int i = 0 ; i < 1000; i++){
      for (int j = i + 5; i < j && i < 1000; i++){
       objeto = new ClasseDoHumberto();   
 
       objeto.fazUmaCoisa();
       objeto.fazOutraCoisa();
       objeto.fazAUltimaCoisa();
      }
      System.gc();
   }
S

quando vc chama System.gc() vc só está dizendo para o Garbage Collector se exforçar para fazer a coleta de lixo… isso não quer dizer que irá fazer… já que ele é um thread sem ser de usuário e de baixa prioridade (DAEMON)…

Criado 27 de julho de 2004
Ultima resposta 29 de jul. de 2004
Respostas 9
Participantes 4