Os métodos estáticos (na verdade, todos os métodos), bem como as variáveis estáticas, são armazenados na PermGen
seção do heap, pois fazem parte dos dados de reflexão (dados relacionados à classe, não relacionados à instância).
Atualização para esclarecimento :
Observe que apenas as variáveis e seus valores técnicos (primitivas ou referências) são armazenados no espaço PermGen.
Se sua variável estática for uma referência a um objeto, esse objeto em si é armazenado nas seções normais do heap (geração jovem / velha ou espaço sobrevivente). Esses objetos (a menos que sejam objetos internos, como classes, etc.) não são armazenados no espaço PermGen.
Exemplo:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
Uma palavra sobre coleta de lixo:
Você não contar comfinalize()
como não é garantido para ser executado. É totalmente responsabilidade da JVM decidir quando executar o coletor de lixo e o que coletar, mesmo se um objeto for elegível para a coleta de lixo.
É claro que você pode definir uma variável estática como nula e, portanto, remover a referência ao objeto no heap, mas isso não significa que o coletor de lixo irá coletá-lo (mesmo se não houver mais referências).
Além disso, finalize()
é executado apenas uma vez, portanto, certifique-se de não lançar exceções ou impedir de outra forma que o objeto seja coletado. Se você interromper a finalização por meio de alguma exceção, finalize()
não será chamado no mesmo objeto uma segunda vez.
Uma nota final : como o código, os dados de tempo de execução etc. são armazenados depende da JVM que é usada, ou seja, o HotSpot pode fazer isso de forma diferente do JRockit e isso pode até diferir entre as versões da mesma JVM. O texto acima é baseado no HotSpot para Java 5 e 6 (esses são basicamente os mesmos), já que na hora de responder eu diria que a maioria das pessoas usa esses JVMs. Devido a grandes mudanças no modelo de memória a partir do Java 8, as declarações acima podem não ser verdadeiras para o Java 8 HotSpot - e eu não verifiquei as mudanças do Java 7 HotSpot, então acho que o acima ainda é verdadeiro para essa versão, mas não tenho certeza aqui.