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