Подтвердить что ты не робот

Каковы переменные 'shadow $_klass_' и 'shadow $_monitor_' для java.lang.Object?

Похоже, что в последнем обновлении Android (SDK 21) в java.lang.Object были добавлены две новые переменные:

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

Я заметил, что shadow$_monitor_ кратко используется в 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);
}

Но в противном случае нет ссылок на них. Они как-то связаны с GC в искусстве? или какой-то родной материал?

4b9b3361

Ответ 1

Они действительно связаны с GC. Кажется, они были добавлены для поддержки указателей Брукса. Я нашел некоторую информацию о указателях Брукса здесь:

Идея состоит в том, что каждый объект в куче имеет одно дополнительное поле ссылки. Это поле указывает на сам объект или, как только объект будет скопирован в новое место, в это новое место. Это позволит нам эвакуировать объекты одновременно с потоками мутаторов.

См., в частности, эти две фиксации:

libcore: a7c69f785f7d1b07b7da22cfb9150c584ee143f4

art: 9d04a20bde1b1855cefc64aebc1a44e253b1a13b