Dado um objeto tem como apagar as referências?

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?

[quote=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?[/quote]

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

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

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

}[/code]

Isso?

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

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)

[code]void method () {
Object obj1 = new Object();
Object obj2 = new Object();

// cleaning local variables
obj1 = null;
obj2 = null;

}[/code]
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.

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?

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

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

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

[quote=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[/quote]

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.

Fiz o exemplo com bastante println:

[code]
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
}
}[/code]

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 pergunta é, será que ele está na memória?!

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

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

Deve ser isso que eu preciso, como que faz?