Solo quería compartir algunas pruebas que realicé 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 ves tamaño de la pila usada se incrementa en un ~ 80 MB, que es de 10 m * sizeof (doble).
Pero si hemos usar doble en vez de doble
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
salida se mostrará 40MB. Solo tenemos referencias dobles, no están inicializadas.
llenándolo con doble
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();
}
Aún 40MB. Porque todos apuntan al mismo objeto doble.
Inicialización con doble en vez
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
Line
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 dobles cada vez, volamos el montón. Esto muestra que los valores dentro de la clase doble se almacenan en el montón.
Eso no es una matriz. Es una referencia a una matriz. La referencia misma podría almacenarse en el montón si es miembro de una clase u objeto, o en la pila si es una variable local en un método. Y los tipos primitivos se pueden almacenar en el montón si son miembros de una clase u objeto. – UncleO