"内化"在JVM源代码中意味着什么?

use*_*818 7 java multithreading jvm

'intrinsify'是否意味着JVM的源代码有些"保守",但JVM编译器可以在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
Run Code Online (Sandbox Code Playgroud)

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

the*_*472 7

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

纯Java实现可能过于复杂而无法被窥孔优化识别 - 例如,与模拟 - 旋转 - 移位不同 - 并且JNI开销会因使用手工组件进行单个操作而导致任何性能提升.

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

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

  • [此处](http://lafo.ssw.uni-linz.ac.at/papers/2015_CGO_Graal.pdf) 是另一个关于如何在 Java Graal 编译器中实现内在函数的有用资源(从第 61 页开始)。还有一个 [Youtube 上的视频](https://youtu.be/WyU7KctlhzE?t=52m2s) 解释了内在函数。 (2认同)