web-dev-qa-db-ja.com

Java.lang.Objectの「shadow $ _klass_」および「shadow $ _monitor_」変数は何ですか?

最新のAndroidアップデート(SDK 21))では、2つの新しい変数が_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);
}
_

しかし、そうでなければ、それらへの参照はありません。それらは何らかの形でARTのGCに関連していますか?または、ある種のネイティブのもの?

56
Tspoon

実際、GCに接続されています。 Brooksポインターをサポートするために追加されたようです。 Brooksポインターに関する情報を見つけました here

考え方は、ヒープ上の各オブジェクトには1つの追加の参照フィールドがあるということです。このフィールドは、オブジェクト自体を指すか、オブジェクトが新しい場所にコピーされるとすぐに、その新しい場所を指します。これにより、ミューテータースレッドと同時にオブジェクトを退避できます

特に次の2つのコミットを参照してください。

libcore:a7c69f785f7d1b07b7da22cfb9150c584ee143f4

art:9d04a20bde1b1855cefc64aebc1a44e253b1a13b

26
Petter