首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shadow$_klass_中“shadow$_monitor_”和“shadow$_monitor_”变量是什么?

在shadow$_klass_中“shadow$_monitor_”和“shadow$_monitor_”变量是什么?
EN

Stack Overflow用户
提问于 2014-11-14 15:55:33
回答 2查看 9.4K关注 0票数 60

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

代码语言:javascript
复制
private transient Class<?> shadow$_klass_;
private transient int shadow$_monitor_;

我注意到shadow$_monitor_hashCode()中被简单地使用了

代码语言:javascript
复制
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有某种联系吗?或者某种土生土长的东西?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-21 10:14:16

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

其思想是堆上的每个对象都有一个额外的引用字段。此字段要么指向对象本身,要么在对象被复制到新位置时立即指向该新位置。这将使我们能够与mutator线程并发地疏散对象。

尤其是这两项承诺:

libcore: a7c69f785f7d1b07b7da22cfb9150c584ee143f4

art: 9d04a20bde1b1855cefc64aebc1a44e253b1a13b

票数 28
EN

Stack Overflow用户

发布于 2021-01-30 11:01:11

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

OpenJDK系列、并行并行、并发标记扫描和G1中有4种较老的GC。然而,这些问题在于,它们至少需要压缩整个旧堆一次&如果堆很大,这将是非常沉重的。100Gb+堆采用小于10 is的停顿设计。

这是通过使用基于Brooks的转发指针来实现的,Pointers.The,shadow_$klass & shadow$_monitor是这些转发指针。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26933888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档