运行时数据区
方法区(Method Area)
存放已加载的信息
异常
如果无法满足内存分配时抛出OutOfMemoryError
Java堆(Java Heap)
所有线程共享,在虚拟机启动时创建。
目的:存放对象实例,几乎所有对象都在这分配内存
这是垃圾收集器管理的主要区域故称GC堆
从垃圾收集器收集算法分为
- 老年代
- 新生代
可以再细分为 - Eden空间
- From Surivivor空间
- To Surivivor空间
从内存分配:分为多个线程私有的分配缓存区(Thread Local Allocation Buffer, TLAB)
规范中规定:Java堆在物理上可以不连续但逻辑上是连续的
虚拟机栈(VM Stack)
线程私有
- 生命周期与线程相同
- 每个方法执行的同时都会创建一个栈帧(Stack Frame)用于存储方法执行所需参数(局部变量表、操作数栈、动态链接、方法出口等)
异常
- 请求深度大于虚拟机允许的深度则抛出StackOverflowError异常
- 如果虚拟机栈可动态扩展(大部分虚拟机允许动态扩展),如果扩展无法申请到内存则抛出OutOfMemoryError异常
局部变量表
- 存放:基本数据类型、对象引用、renterAddress类型(一条字节码指令地址)
- 其所需空间在编译期间完成,且运行期间不会改变其大小
本地方法栈(Native Method Stack)
虚拟机栈与本地方法栈作用相似。虚拟机栈执行Java方法、本地方法栈执行Native方法服务
程序计数器(Program Counter Register)
线程私有
分配较小内存。存放当前线程执行字节码行号指示器,通过改变计数器的值来获取下一条指令
- 执行Java方法,记录正在执行的虚拟机字节码指令地址
- 执行Native方法,计数器为空 Undefined
- 是唯一一个没有规定任何OutOfMemoryError的内存区域。其原因是Java虚拟机是多线程,通过线程轮流切换并分配处理器执行时间方式来执行