第一次学习看字节码文件,这个对工作没什么用,但是会提升内功。
首先介绍两个IDEA插件以及使用:
- BinEd:以16进制格式查看class文件
使用方法:右键class文件,点击Open as binary - JClassLib:以一种更为方便的方式查看字节码,相当于
javap -v HelloWorld.class
使用方法:光标锁定在java源文件-->选IDEA上方菜单-->Show Bytecode With Jclasslib
分析如下java代码的字节码文件
package com.study.jvm;
public class T0100_ByteCode01 {
}
然后我们贴16进制文件进来,下方文件是基于编译器javac 1.8.0_45版本得到。(使用javac -version
查看自己编译器版本)
CAFE BABE
第一个16进制数C,换算成十进制是12,换算成二进制是1100,一个C等于1100,是4位,一个字节占8位。所以一个CA代表一个字节。
然后就是一个字节一个字节的去看十六进制的规则了:
具体看的规则非常之枯燥,需要参考资料。
想看懂字节码还离不开指令集(如:aload_
指令集请参考官方JVM规范文档第6.5章【指令集与其含义】和第7章【opcode和指令的映射关系】。
助记符是指:因为JAVA里面的一条指令是用一个字节来表示的,所以从0X00到0Xff一共256个数字,其中每个数字都代表一条指令。
如:0x03代表的是指令iconst_0,iconst_0是助记符,0X03是真正的指令。他们是相等的。
其他园友的一篇很详细的字节码结构分析
https://www.cnblogs.com/chanshuyi/p/jvm_serial_05_jvm_bytecode_analysis.html
官方虚拟机规范和JAVA语言规范
我们可以在Oracle官网https://docs.oracle.com/javase/specs/index.html获取到任何版本的虚拟机规范和JAVA语言规范。里面全是一手资料,也是最最最最权威的文档。
参考资料:
1.官方JVM规范文档:https://docs.oracle.com/javase/specs/index.html
2.官方JVM8规范文档:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
3.《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》--周志明
4.马士兵老师课程内容