60

最新の 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 と何らかの関係がありますか? それともある種のネイティブのものですか?

4

2 に答える 2

28

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

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

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

ライブラリコア: a7c69f785f7d1b07b7da22cfb9150c584ee143f4

アート: 9d04a20bde1b1855cefc64aebc1a44e253b1a13b

于 2014-11-21T10:14:16.860 に答える