2014-11-14 5 views
43

In der neuesten Android-Update (SDK 21), scheint es, dass zwei neue Variablen java.lang.Object wurden hinzugefügt:

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

Ich bemerke, dass shadow$_monitor_ kurz in hashCode() verwendet wird:

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); 
} 

Aber sonst gibt es keine Hinweise darauf. Sind sie irgendwie verwandt mit GC in ART? Oder irgendeine Art von nativem Zeug?

+2

ich keine Antwort haben, aber einige dieser Links geholfen Ich verstehe, was passieren könnte. Sende sie einfach, wenn sie jemand anderem helfen! http://stackoverflow.com/questions/3362303/whats-a-monitor, http://stackoverflow.com/questions/16721021/what-is-klass-klassklasse, http://stackoverflow.com/questions/1092099/ what-is-variable-shadowing-used-fuer-in-einem-java-class, http://stackoverflow.com/questions/910374/why-does-java-have-transient-variables –

+0

@Tspoon, was ist das? Bedeutung dieser Werte oder wie werden diese Werte verwendet? – Diffy

Antwort

16

Sie sind tatsächlich mit GC verbunden. Sie scheinen hinzugefügt worden zu sein, um Brooks-Zeiger zu unterstützen. Ich fand einige Informationen über Brooks Zeiger here:

Die Idee ist, dass jedes Objekt auf dem Heap ein zusätzliches Referenzfeld hat. Dieses Feld zeigt entweder auf das Objekt selbst oder, sobald das Objekt an einen neuen Ort kopiert wird, auf diesen neuen Ort. Dies wird es uns ermöglichen, Objekte zu evakuieren gleichzeitig mit Mutator-Threads

See vor allem diese beiden Commits:

libcore: a7c69f785f7d1b07b7da22cfb9150c584ee143f4

art: 9d04a20bde1b1855cefc64aebc1a44e253b1a13b

+0

Wie wird hier der Hashcode berechnet? Warum wird die Berechnung in Schatten $ _monitor_ durchgeführt? – Diffy