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