Java 运行时数据区(Runtime Data Area)以及ByteCode的常用指令

Java 运行时数据区

PC:程序计数器(program counter)每个线程对应一个自己的PC

存放指令位置
虚拟机的运行,类似于这样的循环:
while( not end ) {
​ 取PC中的位置,找到对应位置的指令;
​ 执行该指令;
​ PC ++;
}

JVM Stack:每个线程对应一个JVM栈

  1. Frame - 每个方法对应一个栈帧
    1. Local Variable Table:局部变量表
    2. Operand Stack:操作数栈
      对于long的处理(store and load),多数虚拟机的实现都是原子的
      jls 17.7,没必要加volatile
    3. Dynamic Linking动态链接
      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:直接内存

JVM可以直接访问的内核空间的内存 (OS 管理的内存)
NIO , 提高效率,实现zero copy

常用指令

store:赋值

istroe_1:把栈顶的值弹出栈放到局部变量表对应下标为1的位置

load:Load byte from Local Variable Table 从局部变量表中取出值压栈

push:

bipush:push byte 讲该字节扩展成int值压到栈中

pop:弹出栈

mul(multiply):乘法

sub:减法

invoke:

  1. InvokeStatic:执行静态方法
  2. InvokeVirtual:自带多态(执行对应类的对应方法)
  3. InvokeInterface
  4. InovkeSpecial
    可以直接定位,不需要多态的方法
    private 方法 , 构造方法
  5. InvokeDynamic
    JVM最难的指令
    lambda表达式或者反射或者其他动态语言scala kotlin,或者CGLib ASM,动态产生的class,会用到的指令
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值