与虚拟机生命周期一致的区域(线程不安全)
1、方法区
- 各线程共享,虚拟机启动时创建
- 存储已被虚拟机加载的类信息、常量、静态变量,即编辑器编译后的代码等数据
- 常被描述为堆的一个逻辑部分,别名Non-Heap(非堆),为了区分java堆区
- 当无法满足内存分配时,抛出OutOfMemoryError异常
- JDK8中是Metaspace(元空间),JDK6或7中是Perm Space(永久代)
- Run-Time Constant Pool(运行时常量池) 在方法区分配
2、堆
- 虚拟机所管理内存中最大的一块区域,虚拟机启动是创建,所有线程共享
- Java对象实例(包括对象中的普通类型变量,如int等)以及数组都在堆上
- 当无法满足内存分配时,抛出OutOfMemoryError异常
与线程生命周期一致的区域(线程安全)
3、虚拟机栈
- 每个线程有一个私有的虚拟机栈(线程安全的),用来存储该线程中方法的调用状态
- 每一个被线程执行的方法对应一个栈帧
栈帧:
1)可以理解为一个方法的运行空间
2)包含局部变量表、操作数栈、动态链接(指向运行时常量池的引用,将符号引用转换为直接引用)、方法返回地址和附加信息
3)每个方法被执行时,以栈帧的形式压入栈中,方法执行结束时出栈
4)调用链太长会抛出StackOverFlowError异常
4、本地方法栈
- 当线程执行的方法是native类型的话,这些方法就在本地方法栈中执行,也是线程私有的
5、程序计数器
- 每个线程有一个独立的程序计数器,为的是当CPU切换线程执行的时候,返回原先的线程后能够找到之前执行的位置,以便继续执行