OVH Cloud OVH Cloud

type primitifs : le boolean prendrait autant qu'un byte ?

4 réponses
Avatar
Kupee
Salut, on m'a dit, et je ne voulais pas le croire qu'un boolean
ne prenait pas 1 bit de mémoire comme prévu mais bien plus en java.
J'ai donc fait un petit test :
public class Tata {

public static void main(String[] args) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
System.out.println("Allocation");
System.gc();
boolean[] b = new boolean[60000000];
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
System.out.println(b.length);
System.out.println("fini");
}
}
et j'observe la mémoire occupée par la jvm.
Elle est en gros de 6 Mo au début, puis a l'allocation du tableau
passe a 66 Mo.
Je fais le même test avec un tableau de byte, et obtient exactement
la même occupation mémoire. Ca me parrait un peu louche non?
J'ai merdé quelque part ?

4 réponses

Avatar
Bruno Jouhier
Je fais le même test avec un tableau de byte, et obtient exactement
la même occupation mémoire. Ca me parrait un peu louche non?
J'ai merdé quelque part ?


Non. C'est probablement une question de compromis vitesse/taille. Si on
passe sur 1 bit, on gagne de la mémoire mais on ralentit les opérations de
lecture/écriture (car il faut faire des operations de masquage, et de
décalage de bit).

Avatar
Pascal Pizeine
"Kupee" a écrit dans le message de
news:4141d1a1$0$32714$
Salut, on m'a dit, et je ne voulais pas le croire qu'un boolean
ne prenait pas 1 bit de mémoire comme prévu mais bien plus en java.


Il me semble que c'est le cas dans tous les langages, ce n'est pas lié à
Java.
Tu ne peux pas allouer moins d'un octet

J'ai donc fait un petit test :
public class Tata {

public static void main(String[] args) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
System.out.println("Allocation");
System.gc();
boolean[] b = new boolean[60000000];
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
System.out.println(b.length);
System.out.println("fini");
}
}
et j'observe la mémoire occupée par la jvm.
Elle est en gros de 6 Mo au début, puis a l'allocation du tableau
passe a 66 Mo.
Je fais le même test avec un tableau de byte, et obtient exactement
la même occupation mémoire. Ca me parrait un peu louche non?
J'ai merdé quelque part ?


Avatar
Bruno Jouhier
"Pascal Pizeine" a écrit dans le message de
news: ci4ijo$a7f$

"Kupee" a écrit dans le message de
news:4141d1a1$0$32714$
Salut, on m'a dit, et je ne voulais pas le croire qu'un boolean
ne prenait pas 1 bit de mémoire comme prévu mais bien plus en java.


Il me semble que c'est le cas dans tous les langages, ce n'est pas lié à
Java.


Mais dans le cas d'un tableau, on peut grouper 8 booléens dans un octet.

Tu ne peux pas allouer moins d'un octet

J'ai donc fait un petit test :
public class Tata {

public static void main(String[] args) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
System.out.println("Allocation");
System.gc();
boolean[] b = new boolean[60000000];
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
System.out.println(b.length);
System.out.println("fini");
}
}
et j'observe la mémoire occupée par la jvm.
Elle est en gros de 6 Mo au début, puis a l'allocation du tableau
passe a 66 Mo.
Je fais le même test avec un tableau de byte, et obtient exactement
la même occupation mémoire. Ca me parrait un peu louche non?
J'ai merdé quelque part ?






Avatar
Kupee
Pascal Pizeine wrote:
Il me semble que c'est le cas dans tous les langages, ce n'est pas lié à
Java.
Tu ne peux pas allouer moins d'un octet


C'est ce dont je me suis rendu compte en me renseignant
sur les autres langages, ils font pareil.
Effectivement la jvm pourrait compacter des paquets de 8 booleans
dans un byte, mais ca serait un peu tordu, et on y gagnerait
ptet pas grand chose, parce que si c'est pour avoir un pointeur
qui va pointer sur le bit en question on a tout perdu :D