2017-10-20 25 views
2

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.

Répondre

4

"Certaines métadonnées d'objet réservées?" Oui. "Alignement de la mémoire de la structure de données doit être égal à 4 ou 8 octets." Pour l'objet dans son ensemble, oui, mais pas nécessairement pour les champs individuels.

+0

Existe-t-il un moyen d'estimer l'alignement de 'Test' dans ce cas? –

+0

Btw, très intéressant ... Pourquoi le décalage du champ 'b' 18? Même si cela a été le premier? –

+0

Pourriez-vous conseiller un outil pour surveiller la disposition des objets (avec toutes les métadonnées)? –