Dado um objeto tem como apagar as referências?

13 respostas
Basilio

Galera to com uma dúvida, dado um objeto, tem alguma forma de deixar null todas as variáveis que apontam pra ele?
Ex:

Objeto obj1 = new Objeto();
Objeto obj2 = new Objeto();

eu so posso acessar o obj2, tem como fazer o obj1 também parar de referenciar o objeto criado na memória?

13 Respostas

A
Basilio:
Galera to com uma dúvida, dado um objeto, tem alguma forma de deixar null todas as variáveis que apontam pra ele? Ex:
Objeto obj1 = new Objeto();
Objeto obj2 = new Objeto();

eu so posso acessar o obj2, tem como fazer o obj1 também parar de referenciar o objeto criado na memória?

public static void main(String[] args) {
		Objeto objNull = null;

		Objeto obj1 = new Objeto();
		Objeto obj2 = new Objeto();

		obj1 = objNull;
		
		System.out.println(obj1);

	}

Isso?

Basilio

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 é?

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)
void method () {
    Object obj1 = new Object();
    Object obj2 = new Object();

    // cleaning local variables
    obj1 = null;
    obj2 = null;
}
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.
Basilio

Vou refazer o exemplo então:

package pack1;

public class Objeto{
   private stactic Objeto obj1;
   
   protected setObj1(Objeto obj1){
   this.obj1=obj1
   }
  public getObj1(){
  return obj1;
  }
}
package pack1;

public class Usa{
Objeto o = new Objeto();
o.setObj1(o);
}
public class Outra{
Objeto obj2 = getObj1();
}

Agora eu so tenho acesso a classe Outra, e quero remover esse objeto da memória. Tem como?

Lenin666

Garbage Collector?

manda essa assinatura por fim da sua classe q eu acho q ajuda…

void finalize() throws Throwable;

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();

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

Outra deveria esdender (extends) Usa… Não estou entendendo sua dúvida…

A

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.

Basilio

Fiz o exemplo com bastante println:

import newpackage.NewClass;
import newpackage.Objeto;

public class Main {

    public static void main(String[] args) {
        new NewClass().metodo();
        if (Objeto.getObj1() == null) {
            System.out.println("Objeto.getObj1() é nulo");
        }
        Outra outra = new Outra();
        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
    }
}
package newpackage;

public class Objeto {

    private static Objeto obj1;

    protected static void setObj1(Objeto obj1) {
        Objeto.obj1 = obj1;
    }

    public static Objeto getObj1() {
        return obj1;
    }
}
import newpackage.Objeto;

public class Outra {
  public  Objeto obj2 = Objeto.getObj1();
}
package newpackage;

public class NewClass {

    public void metodo() {
        if (Objeto.getObj1() == null) {
            System.out.println("Objeto.getObj1() é nulo no NewClass antes de criar o objeto");
        }
        Objeto o = new Objeto();
        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

A pergunta é, será que ele está na memória?!

Basilio

Ele está na memória. Eu quero tirar ele de lá. Deixa-lo elegível pro GC.

God_of_Java

Eu costumo através de reflection varrer todos atributos do objeto e jogo null neles.

Basilio

Deve ser isso que eu preciso, como que faz?

Criado 25 de fevereiro de 2011
Ultima resposta 25 de fev. de 2011
Respostas 13
Participantes 5