在最新的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有关?还是某种原生的东西?
答案 0 :(得分:24)
他们确实与GC有关。他们似乎已被添加,以支持布鲁克斯的指针。我找到了一些关于布鲁克斯指针的信息here:
这个想法是堆上的每个对象都有一个额外的引用字段。该字段指向对象本身,或者,一旦对象被复制到新位置,就指向该新位置。这将使我们能够使用mutator线程同时撤出对象
特别参见这两个提交:
答案 1 :(得分:0)
这些是与 JDK 中的 Shenandoah 垃圾收集相关的类。
OpenJDK Serial、Parallel、Concurrent Mark Sweep 和 G1 中有 4 个较旧的 GC。然而,这些问题在于它们需要至少压缩整个旧堆一次,如果堆很大,这将非常重。 Shenandoah 的设计为 100Gb+ 堆提供 <10 毫秒的暂停。
这是通过使用基于 Brooks 指针的转发指针来实现的。shadow_$klass
和 shadow$_monitor
是这些转发指针。
Shenandoah GC 的主要思想是,它允许应用程序线程与堆中的对象进行交互,同时它们在压缩期间四处移动(将引用的对象移动到更好的位置),从而无需“停止-世界”
看看另一个 SO 答案:Brooks Pointer in Object class