JVM包含了哪些数据区域,他们又是做什么用的,他们的特点是什么呢?
一、程序计数器
1.计数器记录的是正在执行的虚拟机字节码指令的地址。
2.每个线程都拥有一个独立的程序计数器。
二、虚拟机栈
1.线程私有:一个线程就有一个虚拟机栈
2.其生命周期与其线程一样
3.虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候 都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、 动态链接、方法出口等信息。
4.局部变量表存放用于存放方法参数和方法内部定义的局部变量。
5.系统不会为局部变量赋予初始值(实例变量和类变量都会被赋予初始值)。
6.如果符号引用是在类加载阶段或者第一次使用的时候转化为直接应用,那么这种转换成为静态解析,如果是在运行期间转换为直接引用,那么这种转换就成为动态连接。
三、本地方法栈
1.本地方法栈则是为虚拟机使用到的Native 方法服务
2.本地方法栈的生命周期就是该方法的生命周期
四、堆
1.JAVA堆所有线程共享
2.里面存放的是对象实例
3.堆生命周期和JVM的生命周期相同
五、方法区
1.生命周期和JVM生命周期相同
2.包含类型信息、字段信息、方法信息、其他信息
3.类型信息:
这个类型的全限定名
这个类型的直接超类的全限定名
这个类型是类类型还是接口类型
这个类型的访问修饰符
任何直接超接口的全限定名的有序列表
4.字段信息:
字段名
字段类型
字段的修饰符
5.方法信息:
方法名
方法返回类型
方法参数的数量和类型(按照顺序)
方法的修饰符
6.其他信息:
除了常量以外的所有类(静态)变量
一个指向ClassLoader的指针
一个指向Class对象的指针
常量池(常量数据以及对其他类型的符号引用)
7.常量池:包括实际的常量(string,integer,和floating point常量)和对类型,域和方法的符号引用。
8.方法区线程共享