1、Class文件
(1)无关性:除了平台无关性,JVM还支持语言无关性;目前Clojure、Groovy、JRuby、Jyphon、Scala等语言可以在JVM上运行。实现语言无关性的原理仍然是字节码和JVM:其他语言的程序同样可以编译成Class文件,被JVM执行。字节码是平台无关性的基石。
(2)Class文件是以字节为基础单位的二进制流;各项数据按照顺序严格紧凑的排列,没有分隔符;对于多字节数据使用大端存储。
使用javap -verbose Test.class方法可以分析class文件的内容;javap命令在jdk的bin文件夹里;可以使用WinHex软件查看16进制值。
Class文件结构如下:
魔数:java语言对应的是0xCAFEBABY
版本信息:包括主版本号和次版本号
常量池:包括字面量(基本类型和String)和符号引用(包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符);供后面的内容使用
访问标志:定义了2字节,只使用了8位;包括public/final/super/interface/abstract/synthetic/annotation/enum
类/父类/接口索引
字段:public/protected/private/static/final/synthetic/enum/volatile/transient、类型、名称
方法:public/protected/private/static/final/synthtic/synchronized/bridge/varargs/native/abstract/strictfp[使用 strictfp 关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合IEEE-754规范]【字段表集合和方法表集合不会列出继承自超类或父接口中的字段(方法重写了会列出)】
属性:其中最重要的属性为Code属性,包含方法指令集;ConstantValue属性,被final+static且类型是基本类型或String的字段使用,值为指向常量池的引用;其他还有很多重要属性。
 
2、字节码指令
(1)JVM指令由操作码(一个字节长度)及跟随其后的操作数(0至多个)组成;操作码的种类数不能超过256个。
(2)i代表int,l代表long,s代表short,b代表byte,c代表char,f代表float,d代表double,a代表reference。
(3)字节码指令大体分为9个类型:
加载和存储指令:将数据在帧栈中的局部变量表和操作数栈之间来回传输。
局部变量表->操作数栈:iload/lload/fload/dload/aload及_<n>版本
操作数栈->局部变量表:istore/lstore/fstore/dstore/astore及_<n>版本
常量->操作数栈:iconst_m1(m1表示-1)/iconst_<i>/bipush/sipush/ldc/ldc_w/ldc2_w/aconst_null/lconst_<l>/fconst_<f>/dconst_<d>
【当int取值-1~5采用iconst指令,取值-128~127采用bipush指令,取值-32768~32767采用sipush指令,取值-2147483648~2147483647采用 ldc 指令】
【ldc:将int, float或String型常量值从常量池中推送至栈顶;ldc_w:将int, float或String型常量值从常量池中推送至栈顶(宽索引);ldc2_w:将long或double型常量值从常量池中推送至栈顶(宽索引)】
扩充局部变量表的访问索引:wide
运算指令:加减乘除、求余、取反、位移、按位操作、自增、比较
add/sub/mul/div/rem/neg/shl-shr/or/and/xor/inc/cmp系列
类型转换指令:宽化自动进行,窄化需要指令(永远不会抛出异常)
i2b/i2c……
对象创建与访问指令:类实例与数组不同
创建类实例和数组:new/newarray/anewarray/multianewarray
访问类字段和实例字段:getfield/putfield/getstatic/putstatic
数据元素->操作数栈:baload/caload/……/aaload
操作数栈->数组元素:bastore/castore/……/aastore
取数组长度:arraylength
检查实例类型:instanceof/checkcast
操作数栈管理指令
pop/pop2
dup/dup2/dup_x1/dup2_x1/dup_x2/dup2_x2
swap
控制转移指令
条件分支:if开头
复制条件分支:tableswitch、lookupswitch
无条件分支:goto/goto_w/jsr/jsr_w/ret
方法调用和返回指令
invokevirtual:实例方法,最常用
invokeinterface:接口方法
invokespecial:特殊实例方法,包括实例初始化、私有方法和父类方法
invokestatic:static方法
invokedynamic
return系列:可以包含返回值类型
异常处理指令
抛出异常:athrow
处理异常:不是通过指令,而是通过异常表来完成的
同步指令:方法级同步和方法内部指令同步
同步方法:通过ACC_SYNCHRONIZED标识符确定是否是同步方法
同步指令序列:monitorenter/monitorexit【为了保证在方法异常完成时monitorenter和monitorexit指令依然可以正确配对执行,编译器会自动产生一个异常处理器,声明可处理的所有异常,目的就是执行monitorexit指令】
 
3、参考:《深入理解Java虚拟机》《深入分析Java Web技术内幕》
 

JVM-2.Class文件结构的更多相关文章

  1. 深入理解JVM(六)类文件结构

    6.1 关于类文件 1.class文件的一次编译,到处运行的跨平台性: 2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就 ...

  2. JVM(4) 类文件结构

    一.实现“平台无关性” 字节码(ByteCode)存储格式和虚拟机是实现语言无关性的基础.Java虚拟机不和包括Java在内的任何语言绑定,它只与“Clas”文件这种特定的二进制文件格式所关联,Cla ...

  3. JVM之Class文件结构

    每一个class文件对应一个类或者接口,但是一个类或者接口不一定生成class文件,classloader直接生成. 8为字节为基础的二进制流,各个数据项按照严格的顺序排列在class文件中,没有任何 ...

  4. JVM初探之类文件结构

    java 的 .class 文件字节码如图:Class 文件是一组以8字节为基础单位的二进制流,各个数据项目有着严格的结构.下面我们介绍下class文件的结构. 魔数 class文件的头4个字节是魔数 ...

  5. JVM小结--类文件结构

    字节码是构成Java平台无关性的基石.实现语言无关性的基础是虚拟机和字节码存储格式. Java语言中的各种变量.关键字和运算符的语义最终是由多条字节码命令组成,因此字节码命令所能提供的语义描述能力肯定 ...

  6. 【JVM】虚拟机类加载机制

    什么是类加载 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. <[JVM]类文件结构& ...

  7. Java Class文件详解

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) Java Class文件中包含以下信息: [+]view code ClassFile { u4 magic;  ...

  8. 我的阿里之路+Java面经考点

    我的阿里之路+Java面经考点 时间:2018-03-19 23:03  来源:未知   作者:admin   点击:87次 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三 ...

  9. JVM基础系列第5讲:字节码文件结构

    温馨提示:此篇文章长达两万字,图片50多张,内容非常多,建议收藏后再看. 前面我们说到 Java 虚拟机使用字节码实现了跨平台的愿景,无论什么系统,我们都可以使用 Java 虚拟机解释执行字节码文件. ...

  10. JVM学习04:类的文件结构

    JVM学习04:类的文件结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 类的文件结构知识要点Xmind梳理

随机推荐

  1. Cocos2d-x性能分析-Android版本之Gprof

    在 iOS 平台下我们可以用 Xcode 自带的 Profile 工具来测试我们程序的性能,Android 平台使用的 gprof 这里整理了一下具体的cocos2dx 使用gprof进行性能分析的具 ...

  2. 数据结构与算法(c++)——跳跃表(skip list)

    今天要介绍一个这样的数据结构: 单向链接 有序保存 支持添加.删除和检索操作 链表的元素查询接近线性时间 ——跳跃表 Skip List 一.普通链表 对于普通链接来说,越靠前的节点检索的时间花费越低 ...

  3. Java 代码安全(一)      —— 避免用String储存敏感数据

    Java 代码安全(一)      -- 避免用String储存敏感数据 如果重要的数据(保存在内存中)在使用后没有及时清理,有可能会导致信息泄漏.开发人员通常都回用String 保存敏感数据(密码, ...

  4. 数据可视化之MarkPoint

    MarkPoint是什么效果?如上图,一闪一闪亮晶晶的效果,这是在Echarts中对应的效果.我最早看到的是腾讯的一个Flash的版本,显示当前QQ在线人数的全国分布效果,感觉效果很炫,当时也在想,怎 ...

  5. 【国家集训队2012】tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:  + u v c:将u到v的路径上的点的权值都加上自然数c:  - u1 v1 u2 ...

  6. Composer 常用命令总结(三)

    init(初始化) 该命令用于创建 composer.json 文件,并进行基础信息配置: $ composer init 可以配置Package name.Description.Author.Mi ...

  7. Debian 8 下安装持续集成的工具Jenkins

    前情提示:Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 第一种方法: 1.1 配置java环境变量    解压java到相应目录,我一般习惯把安装的软件 ...

  8. Play初识

    2015年11月21日,写下这篇<Play初识> Play是神马呢?不是Google Play,而是一个java的web框架,因为它抛弃了传统的servlet模式的做法,国内网络连接pla ...

  9. selenium 利用testNG对异常进行自动截图

    哈哈哈,很久没写博客了,懒了. 因为一些原因最近需要把监听事件重新整理一下,开始没细想,直接copy网上的,其实结果发现报错很多,或者是达不到效果,然后把之前的代码翻出来,仔细看了一下.下面给一些需要 ...

  10. 基于三层交换机和基于路由子接口的vlan间路由

    1:通过三层交换机实现vlan间的通信:为三层交换机创建vlan,设置交换机的两个SVI,并配置IP地址. (在二层交换机上只能配置一个SVI端口,用来实现交换机交换机远程管理,在三层交换机上可以配置 ...