Runtime Data Area and Instruction Set

jvms 2.4 2.5

指令集分类

  1. 基于寄存器的指令集
  2. 基于栈的指令集 Hotspot中的Local Variable Table = JVM中的寄存器

Runtime Data Area

PC 程序计数器

存放指令位置

虚拟机的运行,类似于这样的循环:

while( not end ) {

​ 取PC中的位置,找到对应位置的指令;

​ 执行该指令;

​ PC ++;

}

JVM Stack

  1. Frame - 每个方法对应一个栈帧
    1. Local Variable Table
    2. Operand Stack 对于long的处理(store and load),多数虚拟机的实现都是原子的 jls 17.7,没必要加volatile
    3. Dynamic Linking https://blog.csdn.net/qq_41813060/article/details/88379473 jvms 2.6.3
    4. return address a() -> b(),方法a调用了方法b, b方法的返回值放在什么地方

Heap

Method Area

  1. Perm Space (<1.8) 字符串常量位于PermSpace FGC不会清理 大小启动的时候指定,不能变
  2. Meta Space (>=1.8) 字符串常量位于堆 会触发FGC清理 不设定的话,最大就是物理内存

Runtime Constant Pool

Native Method Stack

Direct Memory

image-20210405122311545

JVM可以直接访问的内核空间的内存 (OS 管理的内存)

NIO , 提高效率,实现zero copy

思考:

如何证明1.7字符串常量位于Perm,而1.8位于Heap?

提示:结合GC, 一直创建字符串常量,观察堆,和Metaspace

常用指令

静态语句块初始化

调用构造方法

store 弹栈操作

load 压栈操作

pop 将值弹到栈顶位置 (Pop the top value from the operand stack.)

mul

sub

invoke

  1. InvokeStatic
  2. InvokeVirtual
  3. InvokeInterface
  4. InovkeSpecial 可以直接定位,不需要多态的方法 private 方法 , 构造方法
  5. InvokeDynamic JVM最难的指令 lambda表达式或者反射或者其他动态语言scala kotlin,或者CGLib ASM,动态产生的class,会用到的指令

image-20210405151204316

注意:非静态方法的局部变量表,首个局部变量是this