在最新的Android更新(SDK 21)中,似乎已经向java.lang.Object添加了两个新变量。
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);
}但除此之外,并没有提到它们。它们与艺术中的GC有某种联系吗?或者某种土生土长的东西?
发布于 2014-11-21 10:14:16
它们确实与GC有关。它们似乎是为了支持Brooks指针而添加的。我找到了一些关于布鲁克斯指针here的信息
其思想是堆上的每个对象都有一个额外的引用字段。此字段要么指向对象本身,要么在对象被复制到新位置时立即指向该新位置。这将使我们能够与mutator线程并发地疏散对象。
尤其是这两项承诺:
发布于 2021-01-30 11:01:11
这些是与JDK中的Shenandoah垃圾收集相关的类。
OpenJDK系列、并行并行、并发标记扫描和G1中有4种较老的GC。然而,这些问题在于,它们至少需要压缩整个旧堆一次&如果堆很大,这将是非常沉重的。100Gb+堆采用小于10 is的停顿设计。
这是通过使用基于Brooks的转发指针来实现的,Pointers.The,shadow_$klass & shadow$_monitor是这些转发指针。
Shenandoah GC的主要思想是,它允许应用程序线程在压缩过程中与堆中的对象进行交互(将引用的对象移动到更好的位置),从而消除了“停止世界”的需要。
https://stackoverflow.com/questions/26933888
复制相似问题