java - java.lang.Object 中的 'shadow$_klass_' 和 'shadow$_monitor_' 变量是什么?

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

在最新的 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);
}

但除此之外没有对它们的引用。它们在某种程度上与 ART 中的 GC 有关吗?还是某种原生的东西?

最佳答案

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

The idea is that each object on the heap has one additional reference field. This field either points to the object itself, or, as soon as the object gets copied to a new location, to that new location. This will enable us to evacuate objects concurrently with mutator threads

尤其是这两个提交:

libcore: a7c69f785f7d1b07b7da22cfb9150c584ee143f4

art: 9d04a20bde1b1855cefc64aebc1a44e253b1a13b

关于java - java.lang.Object 中的 'shadow$_klass_' 和 'shadow$_monitor_' 变量是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26933888/

相关文章:

java - 如何从 reader.readLine() 返回的字符串中删除 unicode 空格

java - 从 Assets 中按顺序播放音频 - Android

Lollipop 上的 Android 警报对话框样式不正确

java - 未经检查的对 Class<T> 的调用

java - Spring 启动 : how to use multiple yml files

android - 为什么当我设置 ListView 时应用程序崩溃?

android - 父 Activity 在退出过渡时变得不可见

java - 成功调用 onAnimationUpdate,但在 View::onDraw 中使用 ValueAnimator 时显示没有变化

java - "both"arraylist 和 linkedlist 的好处...可能在 java 中?

android - Lollipop [微调器模式]中没有日历可视化的日期选择器对话框?