为什么 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 的实例从不存储在堆上。
我正在阅读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 的实例从不存储在堆上。