ti-enxame.com

Onde os métodos estáticos e variáveis ​​estáticas são armazenados em Java?

Por exemplo:

class A {
    static int i=0;
    static int j;

   static void method() {
       // static k=0; can't use static for local variables only final is permitted
       // static int L;
    }
}

Onde essas variáveis ​​serão armazenadas em Java, no heap ou na memória da pilha? Como eles são armazenados?

99
Nav

Métodos estáticos (na verdade, todos os métodos), bem como variáveis ​​estáticas, são armazenados na seção PermGen do heap, já que fazem parte dos dados de reflexão (dados relacionados à classe, não relacionados à instância).

Atualização para esclarecimentos:

Observe que apenas as variáveis ​​e seus valores técnicos (primitivos ou referências) são armazenados no espaço PermGen.

Se sua variável estática é uma referência a um objeto que o próprio objeto é armazenado nas seções normais do heap (geração jovem/antiga ou espaço sobrevivente). Esses objetos (a menos que sejam objetos internos como classes etc.) são nã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 na coleta de lixo:

Do não confiar em finalize() como não é garantido para ser executado. É totalmente da responsabilidade da JVM decidir quando executar o coletor de lixo e o que coletar, mesmo que um objeto seja elegível para coleta de lixo.

É claro que você pode definir uma variável estática como nula e, assim, remover a referência ao objeto na pilha, mas isso não significa que o coletor de lixo will coletará (mesmo se não houver mais referências).

Além disso, finalize() é executado apenas uma vez, portanto, é necessário certificar-se de que ele não lança exceções ou impede que o objeto seja coletado. Se você parar a finalização através de alguma exceção, finalize() não será invocado no mesmo objeto pela segunda vez.

ma 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é ser diferente entre as versões da mesma JVM. O acima é baseado no HotSpot para Java 5 e 6 (são basicamente os mesmos) já que na hora de responder eu diria que a maioria das pessoas usava essas JVMs. Devido a grandes mudanças no modelo de memória como de Java 8, as declarações acima podem não ser verdadeiras para Java 8 HotSpot - e eu não verifiquei as mudanças de Java 7 HotSpot, então eu acho o acima ainda é verdade para essa versão, mas não tenho certeza aqui.

131
Thomas

Variáveis ​​de classe (variáveis ​​estáticas) são armazenadas como parte do Class object associado a essa classe. Este objeto Class só pode ser criado pela JVM e é armazenado em permanent generation.

Também alguns responderam que é armazenado em área não heap que é chamado Method Area. Mesmo esta resposta não está errada. É apenas um tópico discutível se o Permgen Area faz parte do heap ou não. Obviamente, as percepções diferem de pessoa para pessoa. Na minha opinião, fornecemos espaço de heap e espaço permgen de maneira diferente nos argumentos da JVM. Portanto, é uma boa suposição tratá-los de maneira diferente.

Outra maneira de ver isso

Os conjuntos de memórias são criados pelos gerenciadores de memória da JVM durante o tempo de execução. O conjunto de memórias pode pertencer à memória heap ou não heap. Um conjunto de constantes de tempo de execução é uma representação de tempo de execução por classe ou por interface da tabela constant_pool em um arquivo de classe. Cada pool constante de tempo de execução é alocado a partir da área de método da máquina virtual Java e as variáveis ​​estáticas são armazenadas nessa área de método. Além disso, este não-heap não é nada além de uma área permanente. Atualmente, a área Método é parte do permanente gen. ( Referência )

enter image description here

24
Aniket Thakur

Esta é uma pergunta com uma resposta simples e uma resposta prolixa.

A resposta simples é o heap. Classes e todos os dados que se aplicam a classes (não dados da instância) são armazenados na seção Geração Permanente do heap.

A resposta longa já está no estouro de pilha:

Há um descrição completa da memória e coleta de lixo na JVM , bem como um resposta que fala mais concisa sobre isso.

13
Vasiliy Sharapov

Antes de Java 8:

As variáveis ​​estáticas foram armazenadas no espaço permgen (também chamado de área do método).

PermGen Space também é conhecido como área do método

PermGen Space usado para armazenar 3 coisas

  1. Dados de nível de classe (meta-dados)
  2. sequências internas
  3. variáveis ​​estáticas

De Java 8 em diante

As variáveis ​​estáticas são armazenadas no próprio Heap. A partir de Java 8, o Espaço PermGen foi removido e o novo espaço nomeado como MetaSpace é introduzido, o que não é mais parte do Heap, ao contrário do Espaço Permgen anterior. O Meta-Espaço está presente na memória nativa (memória fornecida pelo sistema operacional para um determinado aplicativo para uso próprio) e agora armazena apenas os metadados da classe.

As cadeias internas e as variáveis ​​estáticas são movidas para o próprio heap.

Para informações oficiais, consulte: JEP 122: Remova o espaço genético permanente

11
Manish Kumar

Ele é armazenado no heap referenciado pela definição de classe. Se você pensar sobre isso, não tem nada a ver com a pilha porque não há escopo.

9
Amir Raminfar

Além da resposta de Thomas, as variáveis ​​estáticas são armazenadas na área não heap que é chamada de Área do Método.

5
Vipin

Como as variáveis ​​estáticas são variáveis ​​de nível de classe, elas armazenam " geração permanente " da memória heap. Por favor, procure em this para mais detalhes sobre a JVM. Esperando que isso seja útil

4
Ramesh Papaganti

variáveis ​​estáticas são armazenadas no heap

3
Pitelk