理解java字节码

本文深入探讨了Java虚拟机(JVM)如何执行字节码,详细介绍了JVM栈和帧结构,以及局部变量表如何存储方法参数和局部变量。通过具体示例解释了字节码指令的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详情(细节)
    要理解字节码的细节,我们需要知道java虚拟机(jvm)是如何执行字节码的。jvm是基于栈的机器。每个线程

都有一个jvm栈来存储其结构。没当一个方法被调用就会创建一个frame,每个frame是由一个操作数栈,一个局部变

量数组和一个当前方法类的一个运行时常量池的引用组成的。

    局部变量数组又称局部变量表( local variable table),它包含了方法的参数,并用来存放局部变量的值。


首先存储的是参数,以索引0开始。如果frame作为一个构造器函数或实例方法,那么首先存储的便是引用,位置为0


。接着位置1存放第一个形参,位置2存放第二个,以此类推。对于static方法,首先存放的是其第一个参数,位置


为0,以此类推。
    局部变量数组的大小是在编译期由局部变量和方法参数的大小和数量决定的。栈采用的是LIFO(后进先出)原则


存取数据的。它的大小也是在编译期决定的。使用特定的指令(opcode)将值压入栈,另一些指令则用来获取栈数


据,并操作这些数据返回结果。栈也被用来接收方法的返回值。
    
public String employeeName()
{
  return name;
}


Method java.lang.String employeeName()
0 aload_0
1 getfield #5 <Field java.lang.String name>
4 areturn
    以上字节码由三条指令组成。第一条aload_0将局部变量push到栈中的局部变量数组的索引为0的位置。之前我


们已经知道,对于构造器方法和实例方法,其引用总是会被存放在局部变量数组中索引为0的位置上。第二条指令


getfield用来获取对象的字段。当执行这条指令时,栈顶的值被取出。#5时用来在类的运行时常量池中创建一个索


引,用来存放指向类的引用的名称。
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值