Cuidados com uso do garbage coletor

Bom Dia Senhores.

Estou com uma duvida em relação ao garbage coletor. Eu seu que quando um objeto fica null ele é canditado a ser limpo da memória.
A minha duvida é se vale apela setar este null nos objetos ou se eu posso deixar o escopo dele acabar.
Na pratica o que é melhor a Forma 1 ou a Forma 2 ?

Forma 1:
public void metodo(){
Objeto ob = new Objeto()
ob.metodos()
}

Forma 2:
public void metodo(){
Objeto ob = new Objeto()
try {
ob.metodos()
finally{
ob = null;
}
}

Qualquer explicação é bem-vinda!

Em teoria, somente a Forma 1 já é mais do que suficiente. Isso porque, finalizando o escopo do método, a vida do objeto acaba automaticamente. Eu digo “em teoria” porque eu já ví casos (bastaaaaante esotéricos, por sinal) em que o objeto acabava gerando um leak por conta de não ter sido finalizado. Mas esses casos são muito particulares e não devem ser levados como regra. Então, sim, somente deixando o método finalizar já é suficiente.

[]´s

Um objeto declarado dentro de um método pode ser coletado quando o método tem sua execução finalizada. Portanto não ha necessidade de atribuir null ao objeto.

Abs,

Obrigado pelas respostas.

Contudo a regra vale para objetos de classe.
Como por exemplo:
public class Classe (){
private Objeto ob;
public Classe (){
ob = new Objeto();
}
}

Crio um método para setar null nos objetos da classe?

como

public class Classe (){
private Objeto ob;
public Classe (){
ob = new Objeto();
}
public void limpar(){
ob = null;
}
}

Cara, ao postar código, utilize a formatação… no Fórum > Java Básico tem um post fixo lá que explica melhor como faze-lo, caso você tenha dificuldades :stuck_out_tongue:

Acho que não precisa também pois e se outro objeto estiver utilizando ob :?:

[quote=lucaonoforum]Obrigado pelas respostas.

Contudo a regra vale para objetos de classe.
Como por exemplo:
public class Classe (){
private Objeto ob;
public Classe (){
ob = new Objeto();
}
}

Crio um método para setar null nos objetos da classe?

como

public class Classe (){
private Objeto ob;
public Classe (){
ob = new Objeto();
}
public void limpar(){
ob = null;
}
}
[/quote]

Aí depende. Se esses atributos forem referenciados em outros objetos que não são elegíveis para coleta, então eles também não serão. Já se eles ficarem somente dentro desse objeto e o objeto “pai” se tornar elegível, então eles também serão.

[]´s

[quote=drigo.angelo]Cara, ao postar código, utilize a formatação… no Fórum > Java Básico tem um post fixo lá que explica melhor como faze-lo, caso você tenha dificuldades :stuck_out_tongue:

Acho que não precisa também pois e se outro objeto estiver utilizando ob :?:[/quote]

Se eu entendi bem sua pergunta você está se referindo a ilhas de referência.
Isso se dá quando tenho dois objetos, um referenciando ao outro, mas nenhum deles eu possuo referência.

A JVM é capaz de identificar essas ilhas de referência e coleta-los normalmente.

Pessoal Vcs já me ajudaram muito.
Só mais uma pergunta. Um sistema que força a chamada do coletor em locais estratégicos perde muito em desempenho?

[quote=lucaonoforum]Pessoal Vcs já me ajudaram muito.
Só mais uma pergunta. Um sistema que força a chamada do coletor em locais estratégicos perde muito em desempenho? [/quote]

Você até pode SUGERIR uma chamada do gc pelo comando System.gc();
Mas é altamente recomendado que você não o faça. Deixe que a JVM sabe se virar…

Ok pessoal. Valeu pelas ideias.

Em determinados casos alguns objetos acabam indo para geração onde ficam alocados e o coletor passa não enxerga-los. Atribuindo null ao objeto você praticamente obriga o coletor a limpar o ponteiro.

Um bom exemplo disso é quando se trabalha com BufferedImages e Java2D(usando o metodo dispose()).

Tome cuidado com objetos que possuem métodos como close() ou dispose().
Esses métodos devem ser chamados caso o objeto deixe de ser usado.

É o caso de objetos como o ResultSet e a maior parte dos Streams.

Quanto ao garbage collector, não se incomode. Ele trabalha muito bem.
Cuide apenas com variáveis estáticas, pois elas nunca saem de escopo. Na verdade, elas causam tantos problemas que o ideal é evita-las sempre que puder.