JVM运行时数据区总结分享

来源:互联网 发布:孤岛惊魂3优化设置 编辑:程序博客网 时间:2024/06/15 19:14
程序计数器:
特征:
每个线程都有独立的程序计数器
一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器
唯一不会引发异常的区域
作用:
程序计数器是用于存放下一条指令所在单元的地址的地方

本地方法栈(Native Stack):
特征:
线程私有,生命周期与线程相同
后进先出(LIFO)栈
可能出现OutOfMemoryError异常和StackOverflowError异常
作用:
用于支持native方法的执行,存储了每个native方法调用的状态,支撑Native方法的调用、执行和退出


虚拟机栈(VM Stack):
特征:
线程私有,生命周期与线程相同
后进先出(LIFO)栈
可能出现OutOfMemoryError异常和StackOverflowError异常
作用:
存储栈帧,存放各种基本数据类型,对象引用和returnAddress,支持Java方法的调用、执行和退出
有一些虚拟机(如HotSpot)将Java虚拟机栈和本地方法栈合并实现


栈帧的概念和特征:
Java虚拟机栈中存储的内容,它被用于存储数据和部分过程结果的数据结构,同时也被用来处理动态链接、方法返回值和异常分派
一个完整的栈帧包含:局部变量表、操作数栈、动态连接信息、方法正常完成信息和方法异常完成信息


局部变量表概念和特征:
由若干个Slot组成,长度由编译期决定
单个Slot可以存储一个类型为boolean,byte,char,short,float,reference和returnAddress的数据,两个Slot可以存储一个类型为long或double的数据
局部变量表用于方法间参数传递,以及方法执行过程中存储基础数据类型的值和对象的引用 


操作数栈的概念和特征:
是一个后进先出栈,由若干个Entry组成,长度由编译期决定
单个Entry即可以存储一个Java虚拟机中定义的任意数据类型的值,包括long和double类型,但是存储long和double类型的Entry深度为2,其他类型的深度为1
在方法执行过程中,栈帧用于存储计算参数和计算结果;在方法调用时,操作数栈也用来准备调用方法的参数以及接收方法返回结果


方法区(method):
特征:
又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
作用:
主要存放加载的Class类级别、静态对象如class本身、method、field等等
存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,持久代(Permanet Generation)空间不足会引发full GC可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值


堆(heap):
特征:
被所有线程共享的一块内存区域
也成为GC堆,是垃圾收集器管理的主要区域
jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
作用:
存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,其中Survivor由From Space和To Space组成。
原创粉丝点击