首页 技术 正文
技术 2022年11月14日
0 收藏 747 点赞 4,670 浏览 2418 个字

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/pop2dup/dup2/dup_x1/dup2_x1/dup_x2/dup2_x2swap控制转移指令条件分支:if开头复制条件分支:tableswitch、lookupswitch无条件分支:goto/goto_w/jsr/jsr_w/ret方法调用和返回指令invokevirtual:实例方法,最常用invokeinterface:接口方法invokespecial:特殊实例方法,包括实例初始化、私有方法和父类方法invokestatic:static方法invokedynamicreturn系列:可以包含返回值类型异常处理指令抛出异常:athrow处理异常:不是通过指令,而是通过异常表来完成的同步指令:方法级同步和方法内部指令同步同步方法:通过ACC_SYNCHRONIZED标识符确定是否是同步方法同步指令序列:monitorenter/monitorexit【为了保证在方法异常完成时monitorenter和monitorexit指令依然可以正确配对执行,编译器会自动产生一个异常处理器,声明可处理的所有异常,目的就是执行monitorexit指令】 3、参考:《深入理解Java虚拟机》《深入分析Java Web技术内幕》 

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295