一个字节码占一个字节,也就说最多256种操作码
根据指令的特性,主要分为四大类:
- 栈操作指令,包括与局部变量交互的指令
- 程序流程控制指令
- 对象操作指令,包括方法调用指令
- 算术运算及类型转换指令
使用javap命令查看编译好的class文件的内部字节码
字节码的运行时结构
JVM是一台基于栈的计算机器。
每个线程都有一个独属于自己的线程栈,用于存储栈帧。
每一个方法调用,jVM都会自动创建一个栈帧。
栈帧由操作数栈、局部变量数组一级一个Class引用组成。Class引用指向当前方法在运行时常量池中对应的Class。
方法调用的指令
invokestatic:用于调用某个类的静态方法
invokespecial:用来调用构造函数,也可以调用同一个类中的privat方法以及可见的超类方法。
invokevirtual:如果是具体类型的目标对象,invokevirtual用于调用公共、受保护、和package级的私有方法。
invokeinterface:打不过通过接口引用来调用方法时,将会便以为invokeinterface
invokedynamic:JDK新增加的指令,是实现“动态类型语言”支持而进行的升级改造、同时也是JDK8以后支持lambda表达式的实现基础。