Java虚拟机在执行java程序时,会在运行时环境中将其所管理的内存分为几个不同的数据区域。有的区域会在java虚拟机启动进程时创建,死亡时销毁。有些区域则是依赖于用户进程的启动而创建,结束时而销毁
所有线程共享堆和方法区。虚拟机栈,本地方法栈和程序计数器则是线程隔离的数据区。
所以java虚拟机会将其管理的内存分为:
- 堆
- 方法区
- 虚拟机栈
- 本地方法区
- 程序计数器
程序计数器:
线程私有,记录线程正在执行的虚拟机字节码指令的地址。如果执行的是一个java的方法,计数器记录的是正在执行的虚拟机字节码指令的地址。如果是正在执行的是一个native方法,则计数器值为空,唯一一个没有定义OOM Error的区域
Java的虚拟机栈
虚拟机栈是类中的方法的执行过程的内存模型,线程私有。虚拟机栈描述的是java方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。其中64位长度的long 和double 类型会占用连个变量空间(slot)。