Po prostu chciałem podzielić się kilkoma testami, które prowadziłem na ten temat.
Array wielkości 10 milionów
public static void main(String[] args) {
memInfo();
double a[] = new double[10000000];
memInfo();
}
wyjściowa:
------------------------
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
------------------------
Jak widać używane wielkość sterty jest zwiększona o ~ 80 MB, który jest 10m * sizeof (double).
Ale jeśli mamy użyć dwukrotnie zamiast podwójnego
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
Output pokaże 40MB. Mamy tylko podwójne referencje, nie są one inicjowane.
Wypełnianie go z podwójnym
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();
}
Still 40MB. Ponieważ wszystkie wskazują na ten sam podwójny obiekt.
Inicjowanie podwójne zamiast
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
Linia
a[i] = qq.doubleValue();
odpowiada
a[i] = Double.valueOf(qq.doubleValue());
co jest równoważne
a[i] = new Double(qq.doubleValue());
Ponieważ za każdym razem tworzymy nowe Podwójne obiekty, wysadzamy stertę. To pokazuje, że wartości wewnątrz klasy Double są przechowywane w stercie.
To nie jest tablica. Jest to odniesienie do tablicy. Samo odniesienie może być przechowywane na stercie, jeśli jest członkiem klasy lub obiektu, lub na stosie, jeśli jest to zmienna lokalna w metodzie. Typy pierwotne mogą być przechowywane na stercie, jeśli są członkami klasy lub obiektu. – UncleO