一、概览图
二、方法区存储什么?
《深入理解JAVA虚拟机》书中对方法区(Method Area)存储内容描述如下:
它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。
- 类型信息
对每个加载的类型(类class、接口interface、枚举enum、注解annotation),JVM必须在方法区中存储以下类型信息:
- 这个类型的有效完整名称(全名=包名.类名)
- 这个类型直接父类的有效完整名称(对于interface或java.lang.object,都没有父类)
- 这个类型的修饰符(public、abstract、final的某个子集)
- 这个类型的直接接口的有序列表
- 域(Field)信息
- JVM必须在方法区中保存类型的所有域的相关信息,以及域的声明顺序;
- 域的相关信息包括:域名称、域类型、域修饰符(public,private,protected,static,final,volatile,transient的某个子集)
- 方法(Method)信息
JVM必须保存方法的如下信息:
- 方法名称
- 方法的返回类型(或void)
- 方法参数的数量和类型(按顺序)
- 方法的修饰符
- 方法的字节码(bytecodes)、操作数栈、局部变量表及大小(abstract和native方法除外)
- 异常表(abstract和native方法除外),每个异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引
- 全局常量:被final static 修饰的常量,全局常量在编译的时候就被分配了。