程序计数器
作用 : 记住下一条jvm 指令 的执行地址
物理 寄存器
程数计数器通常是放在CPU(中央处理器)的寄存器(Register)中的。寄存器是CPU内部的一种高速缓存,用于存储指令、数据或者地址等信息。
注意: 需要注意的是,寄存器的数量有限,且不同的CPU架构可能具有不同数量和类型的寄存器。因此,虽然程数计数器通常放在CPU的寄存器中,但随着线程数量的增加或者程序的复杂性,可能会出现寄存器不足的情况,这时候虚拟机可能会采取一些策略来进行寄存器分配和管理,以确保程序的正常执行。
特点
- 线程私有
- 不会有内存溢出问题
- 固定大小: 程数计数器只是一个指针,用于存储当前线程执行的字节码指令地址。它的大小是固定的,通常是几个字节的大小,远远小于堆内存或栈内存的大小。因此,即使存在大量线程,每个线程的程数计数器也不会消耗大量内存。
- 线程私有: 每个线程都有自己的程数计数器,它们是线程私有的,不同线程之间不会共享。因此,即使有大量线程在运行,它们各自的程数计数器互不影响,也不会因此导致内存溢出。
- 随线程生命周期动态分配: 程数计数器通常是随着线程的创建和销毁而动态分配和释放内存空间的,而不是像堆内存那样需要预先分配一定的内存空间。这样可以避免因为大量线程存在而导致的内存浪费。
java 源码 -> 二进制字节码-> jvm 指令 -> 解释器 -> 机器嘛码-> cpu执行
JVM 指令集 - 机器码 执行
JVM 指令集与机器码之间的翻译是由 JVM 的即时编译器(JIT编译器)完成的。JIT编译器在运行时将Java字节码转换为机器码。
具体翻译过程如下:
- 解释执行:当程序首次运行时,JVM 使用解释器来逐条读取并执行 Java 字节码。
- 即时编译(JIT编译):随着时间的推移,JVM 会将频繁执行的字节码编译成机器码,并进行优化,从而提高程序的执行效率。
- 机器码执行:执行编译后的机器码。
JIT编译器可以进行各种优化,例如:
- 优化循环。
- 去除死代码。
- 优化内存访问。
- 分析多线程代码,进行优化。
JIT编译器的类型有多种,例如 HotSpot JIT、C1 JIT、C2 JIT 等,它们在不同的阶段以不同的方式进行优化。
这个过程对于用户来说是透明的,不需要