Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域依赖用户线程的启动和结束而建立和销毁
根据Java虚拟机的规范(JavaSE 7)的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示:
- 程序计数器时一块较小的内存空间,它可以看作时当前线程所执行的字节码的行号指示器(当前线程的执行指令地址)
- Java虚拟机栈它的生命周期与线程相同,虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存放局部变量表,操作数栈,动态链接,方法出口信息等,每一个方法从调用到执行完成的过程,就对应一个栈帧在虚拟机栈中入栈出栈的过程.局部变量表存放了编译期可知的各种基本数据类型,对象引用(reference类型,它不等同于对象本身,可能也是一个指向对象的起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAdderss类型(指向了一条字节码指令地址),在java虚拟机规范中对于这个区域规定了两种异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果扩展时无法申请到足够内存,就会抛出OutOfMemoryError异常
- 本地方法栈与虚拟机栈所发挥的作用时非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native服务.
- Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都是在这里分配内存的
- 方法区与Java堆一样也是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据