2.2 运行时数据区域

image.png

2.2.1 程序计数器

Program Counter Register: 可以看做是当前线程所执行的字节码的行号指示器,是线程私有的
java虚拟机的概念模型:表示所有虚拟机的统一外观,但各款具体的Java虚拟机并不一定要完全照着概念模型的定义来进行设计

2.2.2 Java虚拟机栈

  • 生命周期与线程相同
  • 描述的是Java方法执行的线程内存模型:每个方法执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息

局部变量表存放了编译器可知的各种Java虚拟机基本数据类型、对象引用和returnAddress类型
这些数据类型在局部变量表中的存储空间以局部变量槽(slot)来表示

对内存区域有两类异常状况:

  1. StackOverflowError: 如果线程请求的栈深度大于虚拟机所允许的深度
  2. OutOfMemoryError:当栈扩展时无法申请到足够的内存

    2.2.3 本地方法栈

    虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则是为虚拟机使用到的本地方法服务
    本地方法栈也有上述的两种异常

2.2.4 Java堆

  • 虚拟机所管理的内存中最大的一块
  • 是被所有线程共享的一块内存区域,在虚拟机启动时创建
  • 唯一目的是存放对象实例
  • 由于java堆也是垃圾收集器管理的内存区域,因此也被称作“GC堆”(Garbage Collected)
  • 从分配内存的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)

    2.2.5 方法区

  • 各个线程共享的内存区域

  • 用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据

    2.2.6 运行时常量池

  • 是方法区的一部分

  • 具备动态性

    2.2.7 直接内存

  • 不是运行时数据区域的一部分,所以不会受到java堆大小的限制

  • 会受到本机总内存大小以及处理器寻址空间的限制

    2.3 HotSpot虚拟机对象探秘