java内存区域与内存溢出异常(1)
一. 运行时数据区域
java虚拟机在执行Java程序的过程中,会把它所管理的内存划分为若干个不同的数据区域偶
1.程序计数器
程序计数器是一块较小的内存空间,作用是当前线程所执行的字节码的行号指示器。
字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,
分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。
如果正在执行的是java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址
执行的是native方法,则计数器的值为空。
此内存区域是java虚拟机唯一没有规定任何OutOfMemoryError(内存溢出异常)情况的区域
2.Java虚拟机栈
Java虚拟机栈线程私有的,生命周期和线程相同。Java虚拟机栈描述的是Java方法的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成,都代表着一个栈帧在Java虚拟机栈中的入栈和出栈。
人们常说的Java内存区域划分为堆内存和栈内存(较为粗略),其中的栈指的是虚拟机栈中的局部变量表部分
局部变量表存放了编译期可知的各种基本数据类型、对象引用、returnAddress类型。其中64位长度的long和double类型的数据会占用2个局部变量空间,其他占一个局部变量空间。
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,帧中分配多大的局部变量空间是确定的,方法运行期间不会改变。
此区域Java虚拟机规定了两种异常情况:StackOverflowError和OutofMemoryError