Qual é o lugar da memory real para variables ​​estáticas?

A variável estática é alocada para toda a duração da execução do programa, portanto nem a pilha nem o heap são convenientes para ela. Então onde está? Deve haver algum lugar onde é carregado?

Campos estáticos são inicializados quando uma class é carregada e são descartados quando o classloader dessa class é descarregado. Eles podem ser limpos, mesmo duplicados em outro carregador de classs.

Para aplicações como as que usam o OSGi, as variables ​​estáticas que não residem durante a vida útil do aplicativo podem ser recarregadas várias vezes.

Como isso pode ser implementado pode ser dependente de JVM, mas a Sun / Oracle JVM cria um “object” para manter os campos estáticos para uma class. Esse object é acessível por meio da class Inseguro, que também pode ser usada para examinar esses campos de “objects”.

Nós temos 3 segmentos em nossa memory:

  1. Segmento de pilha – contém variables ​​locais e variables ​​de referência (variables ​​que contêm o endereço de um object no heap).

  2. Segmento de heap – contém todos os objects criados em tempo de execução, apenas objects mais seus atributos de object (variables ​​de instância).

  3. Segmento de código – o segmento onde os bytecodes Java compilados reais residem quando carregados. Membros estáticos (variables ​​ou methods) são chamados de membros de class, o que significa que residem onde a class (bytecode) reside, que está no segmento de código.

A variável estática é alocada para toda a duração da execução do programa, portanto nem a pilha nem o heap são convenientes para ela.

Na verdade, os frameworks estáticos (isto é, os frameworks que contêm as variables ​​estáticas) são alocados do heap.

E eles não necessariamente existem durante a execução de um programa. Por exemplo, frameworks estáticos para classs que são carregados dinamicamente podem ser coletados como lixo se o classloader pai, todas as classs e todas as instâncias se tornarem inacessíveis.

De http://www.daniweb.com/software-development/java/threads/34695 :

A memory da variável estática é alocada no início do programa, na memory regular, em vez da pilha (memory reservada especificamente para o programa). A vantagem disso é que ela torna sua variável ou procedimento totalmente constante, e você não pode mudar o valor acidentalmente. A desvantagem disso é que a memory não é desalocada até que o programa seja finalizado. Eu nunca ouvi nada de que valores estáticos ocupam mais memory do que se forem declarados regularmente, mas seu uso de memory é constante.

Das cinco áreas de memory que a JVM usa, os campos estáticos são alocados na Área de Classe (parte do PremGen) quando a class é carregada pelo carregador de classs do Aplicativo durante a fase de preparação e carregamento. Se o campo for primitivo, o valor será armazenado na área de class e, se for do tipo Objeto (novo operador usado), ele será armazenado no heap, mas a referência será dada à variável de campo estático atribuída na área de class. Quando a class é descarregada, a memory para esse campo estático também está disponível para ser coletada pelo GC.

Se o campo também for final, ou seja, final estático, ele será mantido em um pool constante na área de class.