前言
- 类在加载过程中, 根据类别分布在不同的区域
运行时数据区

- 运行时数据区大体分为线程共享数据区: 随着虚拟机启动而创建, 退出而销毁, 为所有子线程共享; 线程独享数据区: 随着线程启动与结束而创建与销毁, 每个线程间隔离.
- 线程共享数据区
- 堆: 存放对象实例, 数组
- 新生代
- Eden
- From(Survivor0)
- To(Survivor1)
- 老年代
- 新生代
- 元数据区(方法区|永生带): 采用**堆外内存(本地内存)**静态变量, 静态方法, 常量, 成员方法, 类模板, 类信息(版本号…)
- 堆: 存放对象实例, 数组
- 线程独享数据区
- 栈
- 局部变量表: 基础类型变量(byte, char, short, int, long, float, double, boolean), 对象句柄(方法参数, 局部变量)
- 操作数栈
- 动态链接
- 返回地址
- 本地方法栈: 本地 native 的内存模型(非 Java 方法)
- 程序计数器(PC 寄存器): 当前线程所执行字节码的行号指示器, 通过改变该计数器来选取下一条将执行的字节码指令
- 栈
- 线程共享数据区
- 堆初始容量默认为 1/64 物理内存 (-Xms -XX)
- 堆最大容量默认为 1/ 4 物理内存 (-Xmx -XX)
- 新生代初始容量默认为堆初始容量 1/3 (-Xmn -XX)
- 新生代最大容量默认为堆最大容量 1/3 (-XX)
- 老年代初始容量默认为堆初始容量 2/3 (-XX)
总结
- 元数据区: 存放类模板; 堆: 存放类实例; 栈: 函数计算
If you enjoyed this, leave a comment~