Volevo solo condividere alcuni test su questo argomento.
array di dimensione 10 milioni
public static void main(String[] args) {
memInfo();
double a[] = new double[10000000];
memInfo();
}
uscita:
------------------------
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
------------------------
Come vedete dimensione heap utilizzato è aumentato di ~ 80 MB, che è 10m * sizeof (doppia).
Ma se abbiamo Doppia uso al posto del doppio
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
uscita mostrerà 40MB. Abbiamo solo riferimenti doppi, non sono inizializzati.
riempiendolo con doppio
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();
}
Ancora 40MB. Perché puntano tutti allo stesso oggetto Double.
Inizializzazione con doppia invece
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
Linea
a[i] = qq.doubleValue();
è equivalente a
a[i] = Double.valueOf(qq.doubleValue());
che equivale a
a[i] = new Double(qq.doubleValue());
Ogni volta che creiamo nuovi oggetti Double, facciamo saltare in aria l'heap. Questo mostra che i valori all'interno della classe Double sono memorizzati nell'heap.
Questo non è un array. È un riferimento a un array. Il riferimento stesso potrebbe essere memorizzato sull'heap se è un membro di una classe o di un oggetto o sullo stack se è una variabile locale in un metodo. E i tipi primitivi possono essere memorizzati nell'heap se sono membri di una classe o di un oggetto. – UncleO