JVM内存模型
定义:
JVM内存模型,又称为运行时数据区。【区别Java内存模型】
紫色 —— 线程私有
浅黄色 —— 线程共享
虚拟机栈
定义:
虚拟机栈是一个线程私有的、FILO的结构。
一个线程到来时,从虚拟机栈中,分配一块内存空间给线程私有。
栈帧
定义:
每个线程中,调用一个方法就会产生一个对应的栈帧压入线程栈中 【随方法生成】
组成:
名称 | 解释 |
---|---|
局部变量表 | 存放方法内的局部变量 【数组】 |
操作数栈 | 用来存放计算过程的数 【辅助栈】 |
动态链接 | 指向==运行时常量池==所属的方法 【存一个内存地址】 |
方法出口 | 返回上层方法被调用的位置 |
动态链接:
在Class文件的常量池中存有大量的符号引用
- 一部分符号引用 在类加载阶段,转化为 直接引用
- 一部分符号引用 在每一次运行期间,转化为 直接引用 【动态链接】
程序计数器
定义:
程序计数器是 线程私有 的,用于记录当前线程所执行字节码的内存地址
作用:
在多线程执行过程中,发生上下文切换而导致的线程挂起,程序计数器记录该线程的字节码执行位置,具有 线程隔离 的特性
本地方法栈
定义:
本地方法栈是 线程私有 的,当程序调用一个native
方法时,该方法会被压入本地方法栈,在 执行引擎 中执行时加载本地方法库。
堆
定义:
线程共有的一块 临界区,存储以下资源
- 对象实例
- 数组
- 字符串常量池
组成:
名称 | 容量 | 作用 |
---|---|---|
老年代 | 2/3【堆空间】 | 存放长期对象 【FullGC的对象】 |
eden区 | 8/10【年轻代】 | 存放短期对象 |
survivor0区 | 1/10【年轻代】 | 用于miniorGC |
survivor1区 | 1/10【年轻代】 | 用于miniorGC |
与GC关系:
- minor GC —— 对于堆中的==年轻代进行垃圾回收==
- fullGC —— 对于==整个堆+方法区进行垃圾回收==
方法区
定义:
在jdk7之前,这块区域叫做永久代
【包含字符串常量池】
在jdk8,这块区域叫做元空间
【移除字符串常量池】
方法区是用物理机的内存,而不是JVM的内存,存放以下信息
- 类元信息
- 运行时常量池
- 静态变量 static
- 常量 —— final static