Bom dia Pessoal. comecei a estudar Threads e pintaram algumas dúvidas.
Pelo que li, NUNCA saberemos o momento exato em que o Garbage Collector vai entrar. Mesmo depois do objeto ter perdido sua referência,
não podemos saber, exatamente, quando este será limado da memória pelo GC. No entanto, existe o System.gc() que pode “sugerir” a JVM a entrada
do GC. A JVM, por sua vez, pode aceitar ou não a sugestão.
Sendo assim, para que serve o System.gc()? Quando tenho que usá-lo?
Além disso, não consegui entender o método finalize() que será chamado no instante em que o gc coletar o objeto.
Não há como usar new Object().finalize()? Por que?
a) O uso de System.gc() é bastante raro e deve ser evitado em aplicações. Se uma aplicação sua só passa a funcionar se você chama System.gc() de vez em quando, ela deve estar com algum problema - por exemplo, tem gente que usa isso porque se esqueceu de fechar arquivos ou conexões na base, nem se deu conta disso, e viu que com um monte de System.gc o problema foi parcialmente resolvido.
b) O método finalize é um método opcional que você pode implementar em uma classe. Por exemplo, se sua classe encapsula o acesso a um objeto do sistema operacional, como um socket ou um handle GDI, e você quer ter certeza absoluta que tal objeto do sistema operacional não ficará “solto” se você esquecer de devolvê-lo explicitamente, então você pode tentar implementar esse método para devolver esses tais objetos ao sistema operacional.
Entretanto, se ela não fizer esse tipo de coisa, é melhor não implementar finalize, porque ele atrapalha o GC em vez de ajudar.
c) new Object().finalize() não faz sentido porque a classe Object não tem o método finalize(), como você deve ter visto no Javadoc.
G
Giminiani
Em relação ao finalize(), ele é, realmente, um método de java.lang.Object.
Mas acredito não ter me expressado bem. Vamos lá.
public class A{
(new A()).finalize(); // Beleza, A estende Object, logo isto está correto.
(new Object().finalize()); // Não funciona, por causa da visibilidade, finalize é protected. Mas pra mim deveria ser visível.
//Por que não é. Me perdoem a confusão...Mas não consegui entender a questão da visibilidade aqui neste contexto
}