【问题标题】:What does 'intrinsify' mean in the JVM source code?JVM 源代码中的“内在化”是什么意思?
【发布时间】:2016-05-23 06:11:49
【问题描述】:

'intrinsify'是否意味着JVM的源代码有些'保守',但是JIT编译器可以在JVM预热时进行一些优化? 例如,

UNSAFE_ENTRY(void, Unsafe_SetOrderedObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
  UnsafeWrapper("Unsafe_SetOrderedObject");
  oop x = JNIHandles::resolve(x_h);
  oop p = JNIHandles::resolve(obj);
  void* addr = index_oop_from_field_offset_long(p, offset);
  OrderAccess::release();
  if (UseCompressedOops) {
    oop_store((narrowOop*)addr, x);
  } else {
    oop_store((oop*)addr, x);
  }
  OrderAccess::fence();  <==There is a full memory barrier to ensure visibility which is NOT strictly required
UNSAFE_END

putOrderedObject 不需要确保immediate visiblity,但是我们可以看到有一个完整的内存屏障将存储附加到指定对象,所以我说JVM是conservative,但是JIT编译器可以优化这个运行时内存屏障,这就是所谓的instrinsify,对吗?

【问题讨论】:

    标签: java multithreading jvm


    【解决方案1】:

    JVM 内在函数是 JDK 中的方法,JIT 为其发出专门的机器指令序列,这些指令序列可以直接内联到调用者中。例如在 x86 上,Integer.bitCount(int) 可以替换为 POPCNT 指令。

    纯 Java 实现可能过于复杂,无法被窥视孔优化识别 - 例如与 emulate-rotation-with-shifts 不同 - JNI 开销会扼杀使用手工组装进行单个操作的任何性能提升。

    许多不安全的方法也被内在化了,因此这些方法调用不是优化器的黑匣子(就像 JNI 方法那样),是的,它允许它不那么保守。但这只是内在化的一个子属性。

    (这些基本上是“热点内在函数”的顶级谷歌搜索结果)

    【讨论】:

    • Here 是关于如何在 Java Graal 编译器中实现内部函数的另一个有用资源(从第 61 页开始)。还有一个 video on Youtube 解释了内在函数。
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2015-05-09
    • 2013-06-06
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多