Isso, mas sem fazer obj1 = objNull;
Imagine que o obj1 estivesse em outra classe e fosse private.
Eu quero eliminar o objeto referenciado da memória, mas se o obj1 continuar apontando pra ele, ele não será eliminado, não é?
H
heatcold
está meio confusa sua pergunta.. mas tentarei responde-la.
o esperado é que os objetos 'sobrevivam' dentro do escopo em que foram declarados:
global (atributo de classe)
local (metodo, laço de repetição, etc...)
uma boa prática seria setar os objetos locais para null após serem utilizados (ex: no fim de um método)
Muita gente não se preocupa com isso, já que o garbage collector deveria ser responsavel por liberar a memoria utilizada por objetos que não estejam referenciados no sistema.
Agora eu so tenho acesso a classe Outra, e quero remover esse objeto da memória. Tem como?
L
Lenin666
Garbage Collector?
manda essa assinatura por fim da sua classe q eu acho q ajuda…
voidfinalize()throwsThrowable;
Eu vou admitir q eu não manjo muito dessa arte, então se mais alguém também puder compartilhar…, tb vou aprender…rs.
Abs();
H
heatcold
a classe Outra vai ‘sobreviver’ dentro de um escopo e suas referencias serão apagadas no fim desse escopo… um conselho… nao se preocupe e confie no garbage collector
A
andredecotia
Outra deveria esdender (extends) Usa… Não estou entendendo sua dúvida…
A
andredecotia
heatcold:
a classe Outra vai ‘sobreviver’ dentro de um escopo e suas referencias serão apagadas no fim desse escopo… um conselho… nao se preocupe e confie no garbage collector
Também acho. Mas confesso que já usei System.gc(); no final da classe que irá forçar o Garbage Collector a trabalhar e
para o meu contexto funcionou, mas não foi a solução mais correta, mas repitou, funcionou… O problema era: Eu invocava uma pilha
de execução e não final eu tinha que remover todos os arquivos gerados no diretório temp de c: (Windows) ou / (Linux e Mac), só que
esses arquivos não eram removidos, percebí que era por eles estavam em uso, na memória pela JVM então chamei a linha de código
citada daí forçou a execução do coletor de lixo GC - Garbage Collector, após isso conseguí fazer o filesArray[1].delete(); funcionar.
B
Basilio
Fiz o exemplo com bastante println:
importnewpackage.NewClass;importnewpackage.Objeto;publicclassMain{publicstaticvoidmain(String[]args){newNewClass().metodo();if(Objeto.getObj1()==null){System.out.println("Objeto.getObj1() é nulo");}Outraoutra=newOutra();if(outra.obj2==null){System.out.println("outra.obj2 é nulo antes do null");}outra.obj2=null;if(outra.obj2==null){System.out.println("outra.obj2 é nulo depois do null");}if(Objeto.getObj1()==null){System.out.println("Objeto.getObj1() é nulo");}else{System.out.println("Eu queria poder apagar esse objeto da memória");}// Objeto.setObj1(null);//nao posso fazer isso}}
packagenewpackage;publicclassNewClass{publicvoidmetodo(){if(Objeto.getObj1()==null){System.out.println("Objeto.getObj1() é nulo no NewClass antes de criar o objeto");}Objetoo=newObjeto();o.setObj1(o);if(Objeto.getObj1()==null){System.out.println("é nulo");}}}
Rodando esse código tenho a saída:
Objeto.getObj1() é nulo no NewClass antes de criar o objeto
outra.obj2 é nulo depois do null
Eu queria poder apagar esse objeto da memória
A
andredecotia
A pergunta é, será que ele está na memória?!
B
Basilio
Ele está na memória. Eu quero tirar ele de lá. Deixa-lo elegível pro GC.
G
God_of_Java
Eu costumo através de reflection varrer todos atributos do objeto e jogo null neles.