JVM内存布局


内存是非常重要的系统资源,是硬盘CPU的中间仓库及桥梁。
JVM内存布局规定了 Java 在运行过程中内存申请、分配管理的政策。

运行时数据区概述


运行时数据区域是JVM内存布局的核心组成部分,其主要组成如下

线程


线程 是一个程序里的运行单元。JVM允许一个应用有多个 线程 并行的执行。
Hotspot JVM 中,每个 线程 都与操作系统 本地线程 直接映射
当一个 Java线程 准备好执行以后,此时一个操作系统的 本地线程 也同时创建。Java线程 执行终止后,本地线程也会回收。
操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法

程序计数寄存器

JVM中的程序计数寄存器(Program Counter Register)也称为程序计数器、pc 寄存器, 是对物理寄存器的一种抽象模拟。

是的,JVM(Java虚拟机)中的程序计数器(Program Counter, PC)寄存器是对物理PC寄存器的一种抽象模拟。在物理计算机体系结构中,PC寄存器通常用于存储下一条要执行的指令的地址。而在JVM中,PC寄存器的概念被用来跟踪当前正在执行的Java字节码指令的位置。

JVM中的PC寄存器具有以下特点:

  1. 线程私有:每个线程都有自己的PC寄存器,这意味着每个线程在执行时都有自己独立的指令流。
  2. 存储指令地址:PC寄存器存储的是当前线程正在执行的字节码指令的地址(或偏移量)。
  3. 只读:一旦字节码解释器或即时编译器(JIT)确定了下一条要执行的指令,PC寄存器的值就会被更新。这个值通常是只读的,因为它代表了程序的执行状态。
  4. 无溢出问题:由于JVM规范定义了字节码指令的长度是固定的,因此PC寄存器的值不会超出其表示范围,不会出现传统物理计算机中的溢出问题。
  5. 异常安全:在Java中,如果发生异常(如OutOfMemoryError),JVM会确保异常处理代码能够正确地恢复到异常发生时的程序状态,这包括了正确地保存和恢复PC寄存器的值。

PC寄存器常见问题

  1. 使用PC寄存器存储字节码指令地址有什么用呢?
  2. 为什么使用PC寄存器记录当前线程的执行地址呢?

答:

指令地址可以获取当前执行代码的位置,下次执行直接从从 指令地址 开始
PC寄存器的特点中有 线程私有 的特点,因此使用PC寄存器进行记录,不同线程切换可以保证执行的都是自己的代码。

CPU时间片

时间片wiki

CPU时间片有以下概念:

  • 并行:多个线程同时执行
  • 串行:多个线程排队执行
  • 并发:多个线程快速切换,达到类似"并行"的效果