JVM-体系结构
# JVM-体系结构
# 体系结构

- java8将Permanent Generation移除,改为Metaspace
- Java栈改为虚拟机栈
- 方法区和堆是线程共享区域,所有线程共享这一块内存数据,随虚拟机或GC而创建和销毁
- 方法区:
- JVM用来存储加载的类信息,常量,静态变量,编译后的代码等数据。
- 类信息
- 运行时常量池
- 字符串常量
- 虚拟机规范中这是一个逻辑区域。具体实现根据不同虚拟机来实现。
- 如:oracle的HotSpot在java7中方法区在永久代,java8在元数据空间,并且通过GC机制对这个区域进行管理。
- JVM用来存储加载的类信息,常量,静态变量,编译后的代码等数据。
- 堆:
- 新生代 New
- Eden
- From Survior/Survior0(S0)
- To Survior/Survior1(S1)
- 老年代 Old
- 新生代 New
- 方法区:
- 虚拟机栈,本地方法栈,程序计数器是线程独占区域,随线程生命周期而创建和销毁
- 虚拟机栈
- 每个线程都有这个私有空间。
- 线程栈由多个栈帧(Stack Frame)组成。
- 一个线程会执行一个或多个方法,一个方法对应一个栈帧。
- 栈帧内容包含:
- 局部变量表
- 操作数栈
- 动态链接
- 方法返回地址
- 附加信息
- ...
- 栈内存默认最大是1M,超出则抛出StackOverflowError
- 本地方法栈
- 和虚拟机栈功能类似,虚拟机栈时为虚拟机执行Java方法准备,本地方法栈是为虚拟机使用Native本地方法而准备的。
- 虚拟机规范没有规定具体的实现,由不同的厂商实现。
- HotSpot虚拟机中虚拟机栈和本地方法栈的实现方式一样,同样超出大小以后会抛出StackOverflowError
- 程序计数器
- 记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器为空。
- 每个线程都在这个空间有一个私有空间,占用内存空间少。
- CPU同一时间,只会执行一条线程中的指令。JVM多线程会轮流切换并分配CPU执行时间的方式。为了线程切换后,需要通过程序计数器,来恢复正确的执行位置。
- 虚拟机栈
# 运行数据区

- JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据
- 虚拟机中这是一个逻辑划分。具体实现根据不同虚拟机来实现。如oracle的HotSpot在Java7中方法区放在永久代,Java8放在元数据空间,并且通过GC机制对这个区域进行管理。
编辑 (opens new window)
上次更新: 2024/05/24, 11:36:46