JVM 规范中的方法数据是什么,它有什么用?
What is the method data in the JVM specification and what is it for?
我正在阅读 the jvm specification,它指出 'Method Area' 存储每个 class 结构,例如 运行-时间常量池、字段和方法数据,以及方法和构造函数的代码。
我知道运行时间常量池是什么。我猜字段和方法数据是代码程序员编写的方法和构造函数的代码或者编译的字节码jdk,但是方法数据到底是什么?
它是 JVM 的五个运行时逻辑内存区域之一,如 Heap、stack、native stack 等...参见 Inside the JVM。
这是它的作用:
当 Java 虚拟机加载一个类型时,它使用 class 加载程序来定位适当的 class 文件。 class 加载程序读取 class 文件——二进制数据的线性流——并将其传递给虚拟机。虚拟机从二进制数据中提取有关类型的信息,并将该信息存储在方法区中。在 class 中声明的 class(静态)变量的内存也从方法区获取。
类型信息:
对于它加载的每种类型,Java 虚拟机必须在方法区中存储以下类型的信息:
- 类型的完全限定名称
类型的直接超级的完全限定名class(除非类型是接口或class java.lang.Object,两者都没有超级class)
类型是class还是接口
类型的修饰符(`public、抽象、最终的某些子集)
任何直接超级接口的完全限定名称的有序列表
这里用一张图来说明:
我正在阅读 the jvm specification,它指出 'Method Area' 存储每个 class 结构,例如 运行-时间常量池、字段和方法数据,以及方法和构造函数的代码。
我知道运行时间常量池是什么。我猜字段和方法数据是代码程序员编写的方法和构造函数的代码或者编译的字节码jdk,但是方法数据到底是什么?
它是 JVM 的五个运行时逻辑内存区域之一,如 Heap、stack、native stack 等...参见 Inside the JVM。
这是它的作用:
当 Java 虚拟机加载一个类型时,它使用 class 加载程序来定位适当的 class 文件。 class 加载程序读取 class 文件——二进制数据的线性流——并将其传递给虚拟机。虚拟机从二进制数据中提取有关类型的信息,并将该信息存储在方法区中。在 class 中声明的 class(静态)变量的内存也从方法区获取。
类型信息:
对于它加载的每种类型,Java 虚拟机必须在方法区中存储以下类型的信息:
- 类型的完全限定名称
类型的直接超级的完全限定名class(除非类型是接口或class java.lang.Object,两者都没有超级class)
类型是class还是接口
类型的修饰符(`public、抽象、最终的某些子集)
任何直接超级接口的完全限定名称的有序列表
这里用一张图来说明: