1. 当虚拟机装载某个类型时,它使用装载器定位相应的class文件,然后读入这个class文件,虚拟机提取其中的类型信息,并将这些信息存储到方法区,该类的类变量也同样存储在方法区。
2.所有的线程共享方法区,对方法区的访问必须线程安全,方法区可以不必连续,方法区也可以被垃圾收集,当某个类不在被引用,可以卸载这个类。
a.类型信息 对每个装载的类型,虚拟机都会再方法区存储:
这个类型的全限定名;
这个类型的直接超类的权限定名;
这个类型是类还是接口;
这个类型的访问修饰符;
任何直接超接口的全限定名的有序列表
b.该类型的常量池:每个装载的类型维护一个常量池,常量池是该类型所用常量的一个有序集合,包括直接常量(string,integer和floating point常量)和堆其他类型,字段和方法的符号引用
c.字段信息:
字段名
字段的类型
字段的修饰符 以及字段在类或者接口中申明顺序
d.方法信息:
方法名
方法的返回类型
方法参数的数量和类型
方法的修饰符集合
方法的字节码
操作数栈和该方法的栈帧的局部变量区的大小
异常表
d.除了常量以外的所有类变量
类变量由所有类实例共享的,这些至于类相关,虚拟机在使用某个类之前,必须在方法区为这些类变量分配空间
另:编译时常量(那些用final申明的以及编译时已知的值初始化的类变量),每个使用编译时常量的类型都会复制它的所有常量到自己的常量池中或嵌入到他的字节码流中,
e.一个到类classLoader的引用
每个类型被装载时候,虚拟机跟踪装载它类型装载器,虚拟机在类型信息中存储对该装载器的引用
f.一个到Class类的引用
每个被装载的类型(无论类还是接口)虚拟机多会创建一个Class类的实例,虚拟机把这个实例和存储在方法区中的类型关联起来
g.方法表
为了提高访问效率,除了原始数据意外,实现中还包括其他数据结构,以提高方法访问效率,虚拟机为每个被装载的非抽象类都生成一个方法表,做为类信息保存在方法区中。