一、运行时内存划分
在JDK1.7中,根据Java虚拟机的规范,将其所管理的内存划分为以下这个运行时数据区域:
1. 程序计数器
当前线程所执行的字节码的行号指示器。每个线程都独立拥有一个程序计数器。
如果线程正在执行的是一个Java方法,则计数器保存正在执行的字节码指令地址,如果是Native方法则程序计数器的值则为空(Undefined)。
程序计数器是Java虚拟机规范中唯一没有规定任何OutOfMemoryError情况的数据区域。
2. Java虚拟机栈
属于线程私有,生命周期和线程相同。每个Java方法在执行时都会创建一个栈帧用于存储局部变量表(基本数据类型和对象引用)、操作数栈、动态链接、方法出口等信息。
每一个方法从调用到执行完成的过程,就对应一个栈帧在虚拟机栈中入栈到出栈的过程。
虚拟机栈中会有两种异常:
- 线程请求的栈深度大于虚拟机所允许的深度,将会抛出StatckOverflowError异常
- 虚拟机栈在动态扩展时无法申请到足够的内存,就会抛出OutOfMemoryError
3. 本地方法栈
同Java虚拟机栈,不过内部执行的是Native方法