Je voulais juste partager quelques tests que j'ai effectués sur ce sujet.
Tableau de taille 10 millions
public static void main(String[] args) {
memInfo();
double a[] = new double[10000000];
memInfo();
}
Sortie :
------------------------
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
------------------------
Comme vous le voyez, la taille du tas utilisé est augmentée de ~80 MB, soit 10m * sizeof(double).
Mais si nous avons utilisé Double au lieu de double
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
La sortie montrera 40MB. Nous avons seulement des références doubles, elles ne sont pas initialisées.
Remplir avec 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();
}
Toujours 40MB. Parce qu'ils pointent tous vers le même objet Double.
Initialisation avec un double à la place
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
Ligne
a[i] = qq.doubleValue();
est équivalent à
a[i] = Double.valueOf(qq.doubleValue());
ce qui est équivalent à
a[i] = new Double(qq.doubleValue());
Comme nous créons de nouveaux objets Double à chaque fois, nous faisons exploser le tas. Cela montre que les valeurs de la classe Double sont stockées dans le tas.
42 votes
Ce n'est pas un tableau. C'est une référence à un tableau. La référence elle-même peut être stockée sur le tas si elle est membre d'une classe ou d'un objet, ou sur la pile si elle est une variable locale dans une méthode. Et les types primitifs peuvent être stockés sur le tas s'ils sont membres d'une classe ou d'un objet.