少年帮|JVM内幕:Java虚拟机详解( 四 )
可以用 javap 查看编译后的 java class 文件字节码 。
如果你编译下面这个简单的类:
package org.jvminternals;public class SimpleClass {public void sayHello() {System.out.println("Hello");}}
运行下面的命令 , 就可以得到下面的结果输出: javap -v -p -s -sysinfo -constants classes/org/jvminternals/SimpleClass.class 。
public class org.jvminternals.SimpleClassSourceFile: "SimpleClass.java"minor version: 0major version: 51flags: ACC_PUBLIC, ACC_SUPERConstant pool:#1 = Methodref#6.#17//java/lang/Object."
这个 class 文件展示了三个主要部分:常量池、构造器方法和 sayHello 方法 。
- 常量池:提供了通常由符号表提供的相同信息 , 详细描述见下文 。
- 方法:每一个方法包含四个区域 ,
- 签名和访问标签
- 字节码
- LineNumberTable:为调试器提供源码中的每一行对应的字节码信息 。 上面的例子中 , Java 源码里的第 6 行与 sayHello 函数字节码序号 0 相关 , 第 7 行与字节码序号 8 相关 。
- LocalVariableTable:列出了所有栈帧中的局部变量 。 上面两个例子中 , 唯一的局部变量就是 this 。
aload0这个操作码是aload格式操作码中的一个 。 它们用来把对象引用加载到操作码栈 。表示正在被访问的局部变量数组的位置 , 但只能是0、1、2、3 中的一个 。 还有一些其它类似的操作码用来载入非对象引用的数据 , 如iload, lload, float 和 dload 。 其中 i 表示 int , l 表示 long , f 表示 float , d 表示 double 。 局部变量数组位置大于 3 的局部变量可以用 iload, lload, float, dload 和 aload 载入 。 这些操作码都只需要一个操作数 , 即数组中的位置ldc这个操作码用来将常量从运行时常量池压栈到操作数栈getstatic这个操作码用来把一个静态变量从运行时常量池的静态变量列表中压栈到操作数栈invokespecial, invokevirtual这些操作码属于一组函数调用的操作码 , 包括:invokedynamic、invokeinterface、invokespecial、invokestatic、invokevirtual 。 在这个 class 文件中 , invokespecial 和 invokevirutal 两个指令都用到了 , 两者的区别是 , invokevirutal 指令调用一个对象的实例方法 , invokespecial 指令调用实例初始化方法、私有方法、父类方法 。 return这个操作码属于ireturn、lreturn、freturn、dreturn、areturn 和 return 操作码组 。 每个操作码返回一种类型的返回值 , 其中 i 表示 int , l 表示 long , f 表示 float , d 表示 double , a 表示 对象引用 。 没有前缀类型字母的 return 表示返回 void
- 金戈鐵馬|特朗普力挺铁杆支持者,枪杀两人的少年没错?抗议活动不断发酵
- 少年|央视要搞选秀,热搜沸了!网友提名他当导师,点赞数第一
- 暖夏少年|2020电脑硬盘销量排行榜:七彩虹加入战局,硬是打倒了金士顿
- 少年一梦|2020畅销手机排行,iPhone无人超越,安卓旗舰全线溃败
- 少年帮|进入倒计时,华为突然宣布,供应链将迎来“洗牌”?
- 上线|原创央视也搞成团选秀!《上线吧!华彩少年》有哪些优势?粉丝放心了
- 海报|央视首档少年成团选秀节目《上线吧!华彩少年》开始全球招募
- 少年帮|正式确认?中科院宣布决定,纯国产“龙芯”即将来临
- 光一样的少年|面对后起之秀,苏泊尔不玩价格战,以一抵八多功能破壁机倍受追捧
- 中国新闻网|专家澄清:视觉训练不能治疗青少年真性近视