10
votes

Taille d'en-tête d'objet en Java sur 64bit VM avec <4 Go de RAM

Je voulais savoir s'il y a un moyen d'avoir l'utilisation des en-têtes d'objet de 64 bits VM à la place des en-têtes d'objet sous 12Byte si la RAM utilisable pour la JVM est de 4 Go de toute façon.

Ou est-ce comme ça sur Linux, sinon windows? Est-ce que quelqu'un pourrait tester cela avec ce code? P>

import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class ObjectSizes {
    String s1;
    String s2;
    public static void main(String[] args) throws Exception {
        Unsafe unsafe;
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            unsafe = (Unsafe)field.get(null);
        } catch (Exception ex) {
            throw new RuntimeException("Can't get Unsafe instance.", ex);
        }
        Field s1Field = ObjectSizes.class.getDeclaredField("s1");
        Field s2Field = ObjectSizes.class.getDeclaredField("s2");
        long s1OffSet = unsafe.objectFieldOffset(s1Field);
        long s2OffSet = unsafe.objectFieldOffset(s2Field);
        System.out.println("We are running "+System.getProperty("java.version"));
        System.out.println("Object header size is "+s1OffSet+" bytes.");
        System.out.println("Object reference size is "+(s2OffSet-s1OffSet)+" bytes.");
    }
}


0 commentaires

3 Réponses :


17
votes

Il ne semble pas que cela soit possible d'avoir un en-tête d'objet de 8 octets sur une JVM 64 bits. L'en-tête est constitué d'un "mot mark", d'un pointeur sur la classe de la classe d'objet, de la taille de la matrice en cas de matrice et de remplissage pour atteindre la limite suivante de 8 octets.

  ,------------------+------------------+------------------ +---------------.
  |    mark word     |   klass pointer  |  array size (opt) |    padding    |
  `------------------+------------------+-------------------+---------------'
  • Le mot mark peut être utilisé pour stocker des pointeurs natifs pour implémenter les serrures et pour aider GC , donc il occupe 8 octets sur un JVM 64 bits. Li>
  • avec des tas plus petits que 32 Go le pointeur de la classe d'objet est compressé à 4 octets . li>
  • Le rembourrage peut être utilisé pour stocker l'un des champs. LI> ul>

    Par conséquent, l'en-tête d'objet sur un système 64 bits peut occuper aussi peu que 8 + 4 = 12 octets, mais pas moins. P> P>


0 commentaires

3
votes

pour 64 bits VMS Il existe des options:

  1. Utilisation des pointeurs compressés via -xx: + USECompressheoops (activé par défaut sur Java 6)

    Dans ce cas: les en-têtes d'objet seront de 12 octets, des en-têtes de réseau seront de 16 octets (4 derniers octets pour la taille de la matrice)

    2.Pas à l'aide de pointeurs compressés via -xx: -Une -secompressecesoops

    Dans ce cas: les en-têtes d'objet seront de 16 octets, les en-têtes de tableau seront 20 octets (4 derniers octets pour la taille de la matrice)

    Le code indiqué ci-dessus n'est pas indépendant de la taille d'un bit VM et donnera des résultats différents pour des ordinateurs virtuels 32 bits et 64 bits. Vous devez envisager de considérer les facteurs de bit-ness et de oups comprimé pour calculer la taille correcte.


0 commentaires

-1
votes

Utilisation des pointeurs compressés via -xx: + USECompressheoops (activé par défaut sur Java 6)

Ce n'est pas vrai pour toutes les versions de Java 6. -XX: + USECompressheoops est activé par défaut commençant par Java 6U25


1 commentaires

Comme vous vous référez à @nitins Réponse, vous pouvez utiliser des commentaires au lieu d'avoir publié une réponse.