JVM 内存分区
-
线程共享
- 方法区:JDK8 之前使用永久代实现,之后使用元空间实现
- 堆:JDK8 之前属于方法区的一部分,之后常量池和静态变量独立出来作为堆

-
线程隔离
- 程序计数器:存储字节码指令地址,执行引擎从程序计数器中取址,执行指令
- 虚拟机栈(Java 方法栈):调用方法时,会将方法包装为一个栈帧并压入
- 栈帧
- 局部变量表
- 主要存储方法的参数、方法内的局部变量、返回值地址
- 存储的基本单位是一个 slot,32 位以内的数据占一个 slot,64 位的占两个 slot
- 编译期决定内容,运行过程中大小不会改变
- 含有直接或间接指向引用类型时,不会被垃圾回收器处理
- 操作数栈
- 存储操作数和运算操作
- 可能会出现运算结果是下一个栈帧需要的返回值,需要将运算结果复制一份并存入下面的栈帧的局部变量表,JVM 做出了优化: 让两个栈帧的一部分重叠,让「下面栈帧的操作数栈」和「上面栈帧的局部变量表」重叠在一起,栈帧返回的时候可以通过重叠的部分共享返回值
- 动态链接 每个栈帧都含有一个指向其所属类的运行时常量池的引用,当调用虚方法时,会根据这个引用查询运行时常量池中的符号引用,确认其真实类型,调用真实类型的目标方法
- 返回地址
- 其他附加信息
- 局部变量表
- 栈帧
- 本地方法栈:用于支持调用本地方法