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?
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: