web-dev-qa-db-fra.com

A quoi servent les variables 'shadow $ _klass_' et 'shadow $ _monitor_' dans Java.lang.Object?

Dans la dernière mise à jour Android (SDK 21), il semble que deux nouvelles variables ont été ajoutées à Java.lang.Object:

private transient Class<?> shadow$_klass_;
private transient int shadow$_monitor_;

Je remarque que shadow$_monitor_ Est brièvement utilisé dans hashCode():

public int hashCode() {
    int lockWord = shadow$_monitor_;
    final int lockWordMask = 0xC0000000;  // Top 2 bits.
    final int lockWordStateHash = 0x80000000;  // Top 2 bits are value 2 (kStateHash).
    if ((lockWord & lockWordMask) == lockWordStateHash) {
        return lockWord & ~lockWordMask;
    }
    return System.identityHashCode(this);
}

Mais sinon, il n'y a aucune référence à eux. Sont-ils en quelque sorte liés au GC en ART? Ou une sorte de truc natif?

56
Tspoon

Ils sont en effet connectés au GC. Ils semblent avoir été ajoutés afin de prendre en charge les pointeurs Brooks. J'ai trouvé des informations sur les pointeurs Brooks ici :

L'idée est que chaque objet du tas possède un champ de référence supplémentaire. Ce champ pointe soit vers l’objet lui-même, soit, dès que l’objet est copié vers un nouvel emplacement, vers ce nouvel emplacement. Cela nous permettra d'évacuer des objets simultanément avec des threads de mutation

Voir surtout ces deux commits:

libcore: a7c69f785f7d1b07b7da22cfb9150c584ee143f4

art: 9d04a20bde1b1855cefc64aebc1a44e253b1a13b

26
Petter