Dado um objeto tem como apagar as referências?

13 respostas
B

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?

B

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

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.
B

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?

L

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

H

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.

B

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

B

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

G

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

B

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