什么是影子$ _klass _'和'影子$ _monitor _' java.lang.Object中的变量?

时间:2014-11-14 15:55:33

标签: java android android-5.0-lollipop art-runtime

在最新的Android更新(SDK 21)中,似乎已向java.lang.Object添加了2个新变量:

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有关?还是某种原生的东西?

2 个答案:

答案 0 :(得分:24)

他们确实与GC有关。他们似乎已被添加,以支持布鲁克斯的指针。我找到了一些关于布鲁克斯指针的信息here

  

这个想法是堆上的每个对象都有一个额外的引用字段。该字段指向对象本身,或者,一旦对象被复制到新位置,就指向该新位置。这将使我们能够使用mutator线程同时撤出对象

特别参见这两个提交:

libcore: a7c69f785f7d1b07b7da22cfb9150c584ee143f4

art: 9d04a20bde1b1855cefc64aebc1a44e253b1a13b

答案 1 :(得分:0)

这些是与 JDK 中的 Shenandoah 垃圾收集相关的类。

OpenJDK Serial、Parallel、Concurrent Mark Sweep 和 G1 中有 4 个较旧的 GC。然而,这些问题在于它们需要至少压缩整个旧堆一次,如果堆很大,这将非常重。 Shenandoah 的设计为 100Gb+ 堆提供 <10 毫秒的暂停。

这是通过使用基于 Brooks 指针的转发指针来实现的。shadow_$klassshadow$_monitor 是这些转发指针。

Shenandoah GC 的主要思想是,它允许应用程序线程与堆中的对象进行交互,同时它们在压缩期间四处移动(将引用的对象移动到更好的位置),从而无需“停止-世界”

看看另一个 SO 答案:Brooks Pointer in Object class