Solo quería compartir algunas pruebas que hice sobre este tema.
Matriz de tamaño 10 millones
public static void main(String[] args) {
memInfo();
double a[] = new double[10000000];
memInfo();
}
Salida:
------------------------
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 puede ver, el tamaño del montón usado aumenta en ~ 80 MB, que es 10 m * tamaño de (doble).
Pero si usamos Double en lugar de double
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
La salida mostrará 40 MB. Solo tenemos referencias dobles, no están inicializadas.
Llenarlo con 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();
}
Todavía 40 MB. Porque todos apuntan al mismo objeto Double.
Inicializando con doble en su lugar
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
Línea
a[i] = qq.doubleValue();
es equivalente a
a[i] = Double.valueOf(qq.doubleValue());
que es equivalente a
a[i] = new Double(qq.doubleValue());
Como creamos nuevos objetos Double cada vez, explotamos el montón. Esto muestra que los valores dentro de la clase Double se almacenan en el montón.