Java虚拟机运行时数据区域的划分

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

程序计数器(Program Counter Register)

一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器,字节码解释器就是通过改变计数器的值来选取下一条执行的字节码指令。每个线程拥有独立的一个计数器。

Java虚拟机栈(Java Virtual Machine Stack)

描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至执行完成的过程,就对应一个栈帧在JVM栈中入栈到出栈的过程。 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。局部变量表的容量以变量槽(Slot)为最小单位,32位虚拟机中一个Slot可以存放一个32位以内的数据类型(boolean、byte、char、short、int、float、reference和returnAddress八种)。虚拟机是使用局部变量表完成参数值到参数变量列表的传递过程的,如果是实例方法(非static),那么局部变量表的第0位索引的Slot默认是用于传递方法所属对象实例的引用,在方法中通过this访问。系统不会为局部变量赋予初始值(实例变量和类变量都会被赋予初始值)。也就是说不存在类变量那样的准备阶段。

本地方法栈(Native Method Stack)

与JVM栈发挥的作用非常相似,区别不过是JVM栈为JVM执行Java方法服务,而本地方法栈为JVM使用到的Native方法服务。

Java堆(Java Heap)

Java堆是被所有线程共享的一块内存区域,在JVM启动时创建。所有的对象实例以及数组都要在这里分配内存,但是随着JIT编译器的发展,渐渐变得不是那么绝对了。

方法区(Method Area)

存储已被JVM加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做Non-Heap。

运行时常量池(Runtime Constant Pool)

方法区的一部分。Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项是常量池,用于存放编译器生成的各种字面量和符号引用。

转载于:https://my.oschina.net/sourcecoding/blog/1823856

你可能感兴趣的:(Java虚拟机运行时数据区域的划分)