60

In the latest Android update (SDK 21), it appears that two new variables have been added to java.lang.Object:

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

I notice that shadow$_monitor_ is briefly used in 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);
}

But otherwise there are no references to them. Are they somehow related to GC in ART? Or some sort of native stuff?

4

2 回答 2

28

它们确实与GC有关。它们似乎是为了支持布鲁克斯的指针而添加的。我在这里找到了一些关于 Brooks 指针的信息:

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

尤其是这两个提交:

libcore:a7c69f785f7d1b07b7da22cfb9150c584ee143f4

艺术:9d04a20bde1b1855cefc64aebc1a44e253b1a13b

于 2014-11-21T10:14:16.860 回答
1

这些是与 JDK 中的 Shenandoah Garbage Collection 相关的类。

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

这是通过使用基于布鲁克斯指针的转发指针来实现的。 shadow_$klass&shadow$_monitor是这些转发指针。

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

看看这个其他的答案:对象类中的布鲁克斯指针

于 2021-01-30T11:01:11.697 回答