Каковы переменные '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 в искусстве? или какой-то родной материал?
Ответы
Ответ 1
Они действительно связаны с GC. Кажется, они были добавлены для поддержки указателей Брукса. Я нашел некоторую информацию о указателях Брукса здесь:
Идея состоит в том, что каждый объект в куче имеет одно дополнительное поле ссылки. Это поле указывает на сам объект или, как только объект будет скопирован в новое место, в это новое место. Это позволит нам эвакуировать объекты одновременно с потоками мутаторов.
См., в частности, эти две фиксации:
libcore: a7c69f785f7d1b07b7da22cfb9150c584ee143f4
art: 9d04a20bde1b1855cefc64aebc1a44e253b1a13b