Eu tenho uma declaração de matriz como esta:
int a[];
Aqui a
está uma matriz de int
tipo primitivo . Onde esta matriz está armazenada? É armazenado em heap ou pilha? Este é um tipo int
primitivo, todos os tipos primitivos não são armazenados no heap.
Respostas:
Como disse o gurukulki, ele é armazenado na pilha. Porém, sua postagem sugeriu um mal-entendido provavelmente devido a alguma pessoa bem-intencionada propagando o mito de que "os primitivos sempre vivem na pilha". Isso não é verdade. Variáveis locais têm seus valores na pilha, mas nem todas as variáveis primitivas são locais ...
Por exemplo, considere o seguinte:
public class Foo { int value; } ... public void someOtherMethod() { Foo f = new Foo(); ... }
Agora, onde
f.value
mora? O mito sugere que está na pilha - mas, na verdade, é parte do novoFoo
objeto e vive na pilha 1 . (Observe que o valor emf
si é uma referência e permanece na pilha.)A partir daí, é uma etapa fácil para os arrays. Você pode pensar em um array apenas como um monte de variáveis - então
new int[3]
é um pouco como ter uma classe desta forma:public class ArrayInt3 { public readonly int length = 3; public int value0; public int value1; public int value2; }
1 Na verdade, é mais complicado do que isso. A distinção pilha / heap é principalmente um detalhe de implementação - acredito que algumas JVMs, possivelmente experimentais, podem dizer quando um objeto nunca "escapa" de um método e podem alocar o objeto inteiro na pilha. No entanto, está conceitualmente na pilha, se você decidir se importar.
fonte
String
são apoiadas por umchar[]
. Eu acredito que strings literais são armazenadas no pool de constantes públicas; para a otimização de GC, isso implicaria que as matrizes de apoio deveriam ser armazenadas da mesma forma (caso contrário, o pool constante teria que ser verificado durante qualquer ciclo de GC onde a matriz de apoio seria elegível para coleta).Ele será armazenado na pilha
porque array é um objeto em java.
EDITAR : se você tiver
int [] testScores; testScores = new int[4];
Pense neste código como se estivesse dizendo ao compilador: "Crie um objeto de matriz que conterá quatro ints e atribua-o à variável de referência chamada
testScores
. Além disso, vá em frente e defina cadaint
elemento como zero. Obrigado."fonte
-g
opção ao compilador. Caso contrário, ele será otimizado.É uma série de tipos primitivos que em si não são primitivos. Uma boa regra prática é que, quando a nova palavra-chave estiver envolvida, o resultado ficará na pilha.
fonte
Eu só queria compartilhar alguns testes que fiz sobre esse assunto.
Matriz de tamanho 10 milhões
public static void main(String[] args) { memInfo(); double a[] = new double[10000000]; memInfo(); }
Resultado:
------------------------ max mem = 130.0 MB total mem = 85.0 MB free mem = 83.6 MB used mem = 1.4 MB ------------------------ ------------------------ max mem = 130.0 MB total mem = 130.0 MB free mem = 48.9 MB used mem = 81.1 MB ------------------------
Como você pode ver, o tamanho do heap usado foi aumentado em ~ 80 MB, que é 10m * sizeof (double).
Mas se tivermos de usar Double em vez de double
public static void main(String[] args) { memInfo(); Double a[] = new Double[10000000]; memInfo(); }
A saída mostrará 40 MB. Temos apenas referências duplas, elas não são inicializadas.
Preenchendo com Double
public static void main(String[] args) { memInfo(); Double a[] = new Double[10000000]; Double qq = 3.1d; for (int i = 0; i < a.length; i++) { a[i] = qq; } memInfo(); }
Ainda com 40 MB. Porque todos eles apontam para o mesmo objeto Duplo.
Inicializando com double ao invés
public static void main(String[] args) { memInfo(); Double a[] = new Double[10000000]; Double qq = 3.1d; for (int i = 0; i < a.length; i++) { a[i] = qq.doubleValue(); } memInfo(); } Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Linha
é equivalente a
que é equivalente a
a[i] = new Double(qq.doubleValue());
Como criamos novos objetos Double a cada vez, explodimos o heap. Isso mostra que os valores dentro da classe Double são armazenados no heap.
fonte
Na linguagem de programação Java, os arrays são objetos, são criados dinamicamente e podem ser atribuídos a variáveis do tipo Object.
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
fonte