Java虚拟机的方法区(Method Area)存储了什么内容

Java虚拟机的方法区(Method Area)存储了什么内容

方法区是各个线程共享的内存区域。存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等等。下图显示了JVM加载类的时候,方法区存储的信息:

java 方法区溢出判断 java 方法区存的有什么_java 方法区溢出判断

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)存储了什么内容相关教程