Java虚拟机的方法区(Method Area)存储了什么内容
Java虚拟机的方法区(Method Area)存储了什么内容
方法区是各个线程共享的内存区域。存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等等。下图显示了JVM加载类的时候,方法区存储的信息:
1、类信息
类型的全限定名
超类的全限定名
直接超接口的全限定名
类型标志(该类是类类型还是接口类型)
类的访问描述符(public、private、default、abstract、final、static)
2、类的常量池
存放该类型所用到的常量的有序集合,包括直接常量(如字符串、整数、浮点数的常量)和对其他类型、字段、方法的符号引用。常量池中每一个保存的常量都有一个索引,就像数组中的字段一样。因为常量池中保存中所有类型使用到的类型、字段、方法的字符引用,所以它也是动态连接的主要对象(在动态链接中起到核心作用)。
3、字段信息(该类声明的所有字段)
字段修饰符(public、protect、private、default)
字段的类型
字段名称
4、方法信息
方法信息中包含类的所有方法,每个方法包含以下信息:
方法修饰符
方法返回类型
方法名
方法参数个数、类型、顺序等
方法字节码
操作数栈和该方法在栈帧中的局部变量区大小
异常表
5、类变量(静态变量)
指该类所有对象共享的变量,即使没有任何实例对象时,也可以访问的类变量。它们与类进行绑定。
6、 指向类加载器的引用
每一个被JVM加载的类型,都保存这个类加载器的引用,类加载器动态链接时会用到。
7、指向Class实例的引用
类加载的过程中,虚拟机会创建该类的Class实例,方法区中必须保存对该对象的引用。通过Class.forName(String className)来查找获得该实例的引用,然后创建该类的对象。
8、方法表
为了提高访问效率,JVM可能会对每个装载的非抽象类,都创建一个数组,数组的每个元素是实例可能调用的方法的直接引用,包括父类中继承过来的方法。这个表在抽象类或者接口中是没有的,类似C++虚函数表vtbl。
9.运行时常量池(Run-Time Constant Pool)
相对于静态常量池,运行时常量池具有动态性,在程序运行的时候可能将新的常量放入运行时常量池中,比如使用String类的intern方法。
参考:
Java虚拟机–方法区(运行时常量池)
Java虚拟机(JVM)的方法区(Method Area)存储了什么内容?
Java虚拟机的静态常量池和运行时常量池
Java虚拟机的方法区(Method Area)存储了什么内容相关教程