J'essaie de comprendre les objets Java et leur mode de stockage en mémoire. J'expérimente avec l'application suivante:Présentation des objets dans Java
private static final Unsafe U = getUnsafe();
public static void main(String[] args)
{
offsets(Test.class);
}
private static <T> void offsets(Class<T> clazz){
Arrays.stream(clazz.getFields())
.forEach(f ->
System.out.println(f.getName() + " offset:" + U.objectFieldOffset(f)
)
);
}
public static class Test{
public boolean b;
public byte b1;
public short b2;
public int b3;
}
La sortie:
b offset:18
b1 offset:19
b2 offset:16
b3 offset:12
QUESTION 1: J'ai expérimenté avec de nombreux types d'objet et a été surpris que les champs ne compense moins de 12 Qu'est-ce que c'est que 12? Un objet réservé metadat?
QUESTION 2: De plus je pensé que alignement de mémoire de la structure de données doit être égal à 4 ou 8 octets. Mais pourquoi offset de b1 est 19, par exemple? Comment interpréter cette sortie Unsafe::fieldOffset
?
P.S. Ceci est pour un but éducatif seulement, pas destiné à l'utilisation en production.
Existe-t-il un moyen d'estimer l'alignement de 'Test' dans ce cas? –
Btw, très intéressant ... Pourquoi le décalage du champ 'b' 18? Même si cela a été le premier? –
Pourriez-vous conseiller un outil pour surveiller la disposition des objets (avec toutes les métadonnées)? –