Ich wollte nur ein paar Tests teilen, die ich zu diesem Thema durchgeführt habe.
Array mit einer Größe von 10 Millionen
public static void main(String[] args) {
memInfo();
double a[] = new double[10000000];
memInfo();
}
Ausgabe:
------------------------
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
------------------------
Wie Sie sehen, wird die Größe des verwendeten Heapspeichers um ~ 80 MB erhöht, was einer Größe von 10 m * (doppelt) entspricht.
Aber wenn wir Double anstelle von Double verwendet haben
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
Die Ausgabe zeigt 40 MB. Wir haben nur Doppelreferenzen, sie werden nicht initialisiert.
Füllen Sie es mit 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();
}
Immer noch 40 MB. Weil sie alle auf dasselbe Double-Objekt zeigen.
Initialisierung stattdessen mit 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.doubleValue();
}
memInfo();
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Linie
a[i] = qq.doubleValue();
ist äquivalent zu
a[i] = Double.valueOf(qq.doubleValue());
das ist äquivalent zu
a[i] = new Double(qq.doubleValue());
Da wir jedes Mal neue Double-Objekte erstellen, blasen wir den Heap aus. Dies zeigt, dass Werte innerhalb der Double-Klasse im Heap gespeichert sind.