Coleta de lixo de objects referenciados por variables ​​estáticas

class StaticTest{ public static SomeClass statVar = new SomeClass(); } 

Depois disso, se StaticTest.statVar e atribuirmos novos objects em momentos randoms, quando todos esses objects serão coletados como lixo? Resposta: No tempo normal de garbage collection.

Mas e se este statVar tiver referências a algumas variables ​​de instância (objects)?

Não está claro?

Ok, o tempo de vida das variables ​​estáticas é até a class descarregada. Nos aplicativos da web, estamos inicializando muitas coisas no contexto estático. Incase se estamos fornecendo algumas referências de object para este contexto estático, mas não estamos liberando-os, então como ele é coletado?

Eu ficaria muito feliz em discutir sobre isso.

Objetos referenciados pela variável estática serão coletados como lixo no momento da descarga da class. Portanto, sempre que os objects referenciados pela referência estática não serão gerados até que a class seja descarregada (porque sempre há uma referência alcançável para o object na pilha).

Pense nos Objetos na memory, não nas variables. statVar é uma referência a algum object na memory. Se você mantiver uma referência ao mesmo Objeto em algum outro lugar, o Objeto não receberá GC até que essa referência seja liberada. Não importa se a class é descarregada e statVar desaparece, porque essa é apenas outra referência a um object que ainda tem referências em statVar . Então, não será limpo nesse caso.

Referências a objects estáticos são tipicamente consideradas raízes de GC e o que elas apontam (e o que quer que seja amarrado por esses objects) será considerado vivo. Se você quiser que o object ao qual ele se refere seja sujeito de uma garbage collection, você precisará limpar a referência a eles (e todas as outras referências também, é claro).

Se sua class não for mais referenciada e sua JVM estiver configurada para coletar classs não utilizadas, a resposta do thinksteep será aplicada. Eu não prenderei minha respiração esperando por aquele momento.

Contanto que você mantenha os dados referenciados, a resposta é simplesmente que eles não serão apagados. Essa é a parte mais fundamental do protocolo quando você tem um GC.

Como uma nota lateral, eu raramente acho que é uma boa idéia manter as coisas em um contexto estático em aplicativos da web, a menos que seja um object singleton ou algo que é compartilhado por todos os usuários desse aplicativo da web. Nesse caso, por que você quer que ele seja limpo enquanto seu servidor de aplicativos estiver em execução? Não faz sentido.