[二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

方法区

方法区是可供各个线程共享的运行时内存区域,存储了每一个类的结构信息,如:
运行时常量池/字段和方法数据/构造函数和普通方法的字节码内容/类实例接口初始化时用到的特殊方法
方法区在虚拟机启动的时候创建
方法区也可以被垃圾收集
方法区大小不必是固定的 可以根据需要动态扩展  
方法区空间也不必是连续的
 
具体存储的信息包括:
类型信息
类的全限定名
类型的直接超类全限定名
类型 类还是接口
访问修饰符
直接超接口的全限定名
字段信息
字段名
字段类型
字段的修饰符
方法信息
方法名
方法的返回类型
方法的参数数量和类型
方法的修饰符
方法的字节码(有方法体的)
操作数栈和该方法栈帧中的局部变量表   的大小(其实也还是class文件属性表的内容 静态的)
常量池--下面的运行时常量池区域
除了常量以外的所有类变量
类变量是所有类实例共享的,即使没有任何类实例,他也可以被访问,这些变量仅仅和类有关
所以
类变量总是作为类型信息的一部分存储在方法区
除了在类中声明的编译时常量外,虚拟机使用某个类之前 必须在方法区中为这些类分配空间
编译时常量指的是final声明以及用编译时已知的值初始化的类变量
这种和一般的类变量还不一样,每个使用编译时常量的类型,都会复制他的所有常量到自己的常量池中 或者嵌入到他的字节码流中
说白了对于这种值不变的,直接复制过去
类ClassLoader的引用/Class类的引用
每个类被装载后都必须跟踪他是由哪个类加载器加载的
对于每个被装载的类型,不管是类还是接口,虚拟机都会相应的为他创建一个java.lang.Class类的实例
而且虚拟机还必须以某种方式把这个实例和存储在方法区中的类型数据关联起来

运行时常量池

运行时常量池属于方法区的一部分
class文件中每一个类或者接口的常量池表 constant_pool table 运行时的表示形式
只需要记住与class文件中的constant_pool相对应即可理解所包含的内容
包括了若干种不同的常量
从编译器可知的数值字面量到必须在运行期解析后才能获得的方法或字段引用
运行时常量在Java虚拟机的方法区分配  加载类或者接口到虚拟机后,就创建对应的运行时常量池
 
总结:
所有的类型信息,静态数据信息,都加载到方法区中

另外类加载器以及当前Class对象这种运行时必须的信息,也被保存在方法区