为什么 jdk 本机重构从堆中获取 class

why the jdk native refactor get class from heap

我正在阅读jdk 19(编译时支持m1芯片)源代码,在reflection.cpp中的重构源代码中,功能如下:

oop Reflection::invoke_method(oop method_mirror, Handle receiver, objArrayHandle args, TRAPS) {
  oop mirror             = java_lang_reflect_Method::clazz(method_mirror);
  int slot               = java_lang_reflect_Method::slot(method_mirror);
  bool override          = java_lang_reflect_Method::override(method_mirror) != 0;
}

当我追踪这个 clazz 函数时 java_lang_reflect_Method::clazz:

oop java_lang_reflect_Method::clazz(oop reflect) {
  return reflect->obj_field(_clazz_offset);
}

obj_field 函数从堆中获取 oop 数据。这让我有点困惑,堆存储所有对象实例,为什么反射从堆中获取数据?我认为它将从方法区获取元数据,因为其中存储 class 元数据,使用元数据可以构建 class 信息。 obj_field 看起来像这样:

inline oop  oopDesc::obj_field(int offset) const                    { return HeapAccess<>::oop_load_at(as_oop(), offset);  }

这会读取 java.lang.reflect.Method 对象的 clazz 字段。

java.lang.reflect.Method 是一个常规的 Java class(在一些本地助手的支持下)。为什么你期望它不存储在堆上?


注意 java.lang.reflect.Method is not the same as a hotspot-internal C++ class Method.

class Method 是热点 JVM 引擎的实现细节,此内部 C++ class 的实例从不存储在堆上。