1. JVM 运行时内存
1.1 线程私有
① 线程计数器
- 可以看作是当前线程所执行的字节码的行号指示器
- 字节码解释器通过这个计数器的值来获取下一条需要执行的指令
- 是唯一一个不会出现 OOM 的内存区域
- 随着线程创建而创建、随着线程销毁而销毁
② 虚拟机栈
- 是由一个个栈帧组成:每个栈帧里面都有局部变量表、操作数栈、动态链接、方法出口信息
- 生命周期和线程一样
- 局部变量表:存放了各种编译期可知的数据类型(基本数据类型)和对象引用
- 可能会出现两种错误:SOF 和 OOM
- SOF:若虚拟机栈内存不允许动态扩展,线程请求深度超过栈的最大深度
- OOM:若堆中没有空闲内存、而且垃圾回收器也无法提供更多内存
③ 本地方法栈
- 和虚拟机栈类似,只不过是服务于本地方法
1.2 公有区域
① 堆
- 虚拟机中锁管理内存中最大的一块,“几乎” 所有的对象实例 、数组都在堆中分配
- 从 JDK1.7 就已经默认开启逃逸分析,如果某些方法中的对象引用没有被返回或者未被外面使用,那么对象可以直接再栈上分配内存
- Java 堆是垃圾收集器管理的主要区域,也被称为 GC 堆,从垃圾回收的角度可以分为新生代和老年代,新生代再细 Eden、Form Survivor、To Survivor 默认比例是 8:1:1