jvm

jvm

1. JVM 内存模型

线程独占:

  • 栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,局部变量表存放的是 8大基础类型加上一个应用类型,所以还是一个指向地址的指针。
  • 本地方法栈:主要为 Native 方法服务
  • 程序计数器:记录当前线程执行的行号,执行Native 方法时 , 程序计数器为空 .

线程共享:

  • 堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要在堆上分配。当堆没有可用空间时 , 会抛出 OOM 异常 . 根据对象的存活周期不同 ,JVM 把对象进行分代管理 , 由垃圾回收器进行垃圾的回收管理
  • 方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字节码)等数据。1.7的永久代和 1.8 的元空间都是方法区的一种实现

Jingxc大约 18 分钟java后端java后端jvm
JVM指令手册

JVM指令手册

1. 栈和局部变量操作

1.1 将常量压入栈的指令

指令 功能 指令 功能
aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈
iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈
iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈
iconst_4 将int类型常量4压入栈 iconst_5 将int类型常量5压入栈
lconst_0 将long类型常量0压入栈 lconst_1 将long类型常量1压入栈
fconst_0 将float类型常量0压入栈 fconst_1 将float类型常量1压入栈
dconst_0 将double类型常量0压入栈 dconst_1 将double类型常量1压入栈
bipush 将一个8位带符号整数压入栈 sipush 将16位带符号整数压入栈
ldc 把常量池中的项压入栈 ldc_w 把常量池中的项压入栈(使用宽索引)
ldc2_w 把常量池中long类型或者double类型的项压入栈(使用宽索引)

Jingxc大约 10 分钟java后端jvmjava后端