Java运行时数据区域
Java虚拟机所管理的内存包括以下几个运行时数据区域,如下图:
程序计数器
程序计数器(Program Counter Register)是一块较小的内存区域,是当前线程执行的字节码的行号指示器。程序计数器是一块私有的内存区域,每个线程都有一个独立的程序计数器。如果线程正在执行的是一个Java方法,这个程序计数器记录的是正在执行的虚拟机字节码指令地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined)。程序计数器所在的内存区域是唯一一个在Java虚拟机没有OOM(OutOfMemoryError)情况的区域。
Java虚拟机栈
Java虚拟机栈(Java Virtual Machine Stack)也是线程私有的,生命周期与线程同步。虚拟机栈描述的是Java方法执行的内存模型:每个方法执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链、方法出口等信息。每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
虚拟机栈内存区域会出现两种异常:
1.当线程请求的栈深度大于虚拟机允许的深度,会抛出StackOverflowError异常;
2.当改区域需要扩展时申请不到足够的内存,就会抛出OOM(OutOfMemoryErro)异常。