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
a[i] = qq.doubleValue();
é equivalente a
a[i] = Double.valueOf(qq.doubleValue());
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.