1.运行时数据区域:
- 程序计数器
- 虚拟机栈
- 堆(heap)
- 方法区
- 本地方法栈
(1)程序计数器:
当前线程所执行的字节码的行号指示器,字节码解释器在工作时通过改变该计数器的值来选取下一条要执行的字节码指令
所占内存区域很小
(2)虚拟机栈(≈栈内存):
线程私有,生命周期与线程相同
Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息
每个方法从被调用到执行完成,都对应一个栈帧在虚拟机栈中从入栈到出栈的过程
*局部变量表:存放编译期可知的各种基本数据类型、对象引用类型和returnAddress类型(指向了一条字节码指令的地址);局部变量表所需的内存在编译期间完成分配,方法运行期间不改变大小
可能出现的异常:StackOverflowError:线程请求栈深大于虚拟机允许的栈深
OutOfMemoryError:无法申请到足够的内存
(3)堆(堆内存heap):
所有线程共享,虚拟机启动时创建,存放对象实例,几乎所有的对象实例都在这里分配内存
垃圾收集器管理的主要区域,也称为 GC堆
现在垃圾收集器大都采用分代收集算法,所以堆可以分为:新生代和老生代
线程共享的Java堆中可能划分出多个线程私有的分配缓冲区&