Java虚拟机字节码分析

来源:互联网 发布:全国地址数据库 mysql 编辑:程序博客网 时间:2024/06/08 00:09

注:随时更新字节码学习进度

工具:java字节码查看工具jclasslib bytecode viewer(单击可下载)

工具使用截图:


字节码分析:

来一个简单的类(什么都没有)

public classZijiema{
private inta =987654321;//定义一个变量
public staticvoidmain(String[]args){
}
}
编译成.class文件然后使用字节码查看工具打开。

关联:http://blog.chinaunix.net/uid-21718047-id-3335329.html

逐个解释这10部分(图片中右侧栏中的10行)

.class十六进制机器码:也就是jvm最终的机器执行码(uedit32)打开class能看到

0、魔数

这个在字节码查看器中没有体现出来,它是由java创始人James Gosling定制,它的值是0XCAFE BABE,也就是上面十六进制的前8个字符

占用大小是4字节CA是一字节(一个字节16个二进制位java采用的是Unicode编码格式).

魔数用来区分文件类型,用文件的前几个字节来表示,0XCAFE BABE表示的是class文件(将文件类型写在文件内部即使用户重命名也没有用这样安全)

CAFE BABE翻译过来是咖啡宝贝(幸好这几个字符都在十六进制范围内)。

1、版本号(图1中1,2行)

版本号含主版本号和次版本号,各占2个字节在十六进制中0X0000 0033(在上面图中找找)前面的0000是次版本号,0033是主版本号对应十进制51也就是jdk1.7

次版本号是0,也就是jdk1.7.0

O:\zijiema>java -version
java version "1.7.0_80"
Java(TM)SERuntime Environment (build1.7.0_80-b15) //这是我在cmd中打印出来的
Java HotSpot(TM)64-BitServer VM (build24.80-b11, mixed mode)
2、常量池

紧接版本号之后的就是常量池入口,它是是Class文件中的资源仓库

常量池中主要存储两大类常量

图解:

字面量:

字面量如文本字符串,java中声明为final的常量等等,例如 int i = 1;把整数1赋值给int型变量i,整数1就是Java字面量

符号引用:

而符号引用如类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符

为什么需要类和接口的全局限定名?系统引用类或者接口的时候不是通过内存地址进行操作吗?这里大家仔细想想,java虚拟机在没有将类加载到内存的时候根本都没有分配内存地址,也就不存在对内存的操作,所以java虚拟机首先需要将类加载到虚拟机中,那么这个过程设计对类的定位(需要加载A包下的B类,不能加载到别的包下面的别的类中),所以需要通过全局限定名来判别唯一性。这就是为什么叫做全局,限定的意思,也就是唯一性.

注:U表示1字节

3、访问标志Access_Flag

访问标志信息包括该Class文件是类还是接口,是否被定义成public,是否是abstract,如果是类,是否被声明成final.


0x 0021:是0×0020和0×0001的并集.其中0×0020这个标志值涉及到了字节码指令.http://www.importnew.com/24088.html



原创粉丝点击