2014-11-14 3 views
43

nell'ultimo aggiornamento di Android (SDK 21), sembra che 2 nuove variabili sono state aggiunte java.lang.Object:

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

mi accorgo che shadow$_monitor_ viene utilizzato brevemente 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); 
} 

Ma altrimenti non ci sono riferimenti a loro. Sono in qualche modo legati a GC in ART? O una sorta di roba nativa?

+2

Non ho una risposta, tuttavia alcuni di questi collegamenti ha aiutato capisco cosa potrebbe accadere. Pubblicandoli solo in caso aiutino qualcun altro! http://stackoverflow.com/questions/3362303/whats-a-monitor, http://stackoverflow.com/questions/16721021/what-is-klass-klassklass, http://stackoverflow.com/questions/1092099/ what-is-variable-shadowing-used-for-in-a-java-class, http://stackoverflow.com/questions/910374/why-does-java-have-transient-variables –

+0

@Tspoon, qual è il significato di questi valori o come vengono utilizzati questi valori? Qualche idea? – Diffy

risposta

16

Sono effettivamente collegati a GC. Sembra che siano stati aggiunti per supportare gli indicatori di Brooks. Ho trovato alcune informazioni sui puntatori Brooks here:

L'idea è che ogni oggetto nell'heap ha un campo di riferimento aggiuntivo. Questo campo punta all'oggetto stesso o, non appena l'oggetto viene copiato in una nuova posizione, in quella nuova posizione. Questo ci permetterà di evacuare gli oggetti in concomitanza con le discussioni mutatori

si veda in particolare questi due commit:

libcore: a7c69f785f7d1b07b7da22cfb9150c584ee143f4

art: 9d04a20bde1b1855cefc64aebc1a44e253b1a13b

+0

come viene eseguito il calcolo dell'hashcode qui? Perché il calcolo viene eseguito su shadow $ _monitor_? – Diffy