读书人

jvm学习札记-class文件检验器

发布时间: 2012-09-08 10:48:07 作者: rapoo

jvm学习笔记-class文件检验器
唉,记忆力衰退了吗?记不住东西了,留个笔记吧,内容来自《深入Java虚拟机》

和类装载器一起,class文件检验器保证装载的class文件内容有正确的内部结构。它要进行4趟独立的扫描:

第一趟:class文件结构检查
在类装载期间扫描,在这次扫描中,对每一段被当做类型导入的字节序列,它都会去确认是否符合java class文件的基本结构,比如:
1.每个class文件必须以这四个字节开始:0xCAFEBABE,这个魔数是一个class的标志,不以它开头的文件压根不是class文件
2.检查class文件中声明的主版本号和次版本号(紧跟着魔数后边的字节序列)是否在当前虚拟机的支持范围
3.class文件中每一个组成部分都声明了长度了类型,class文件检验器也必须检查这个class文件有没有被删节,尾部也不能附带其他字节
4.等等...

第二趟:类型数据的语义检查
在连接过程中,在第一趟扫描的基础上,检查了一些Java语言在编译期间应遵守的强制规则(jvm不能完全放心javac,这个可以理解,毕竟它都不知道现在加载的是哪个javac编译器产生的字节码)。查看每个组成部分,确认它们是否是其所属类型的实例,结构是否正确,确认每个方法描述符都是符合特定语法的、格式正确的字符串,例如:
1.方法描述符(返回类型、参数类型、参数个数)在class文件中被存储为一个字符串,这个字符串必须符合特定的上下文无关文法
2.除Object类以外,所有类都必须有一个父类
3.final类不能被继承、final方法不能被覆盖
4.常量池中的条目是否合法、常量池索引是否指向正确的常量池条目
5.等等...

第三趟:字节码验证
同样是在连接过程中进行,对字节流进行数据流分析,例如:
1.确保操作数栈包含正确的数值和类型
2.局部变量在被赋值前不能被访问
3.每个操作码都必须合法
4.等等...

前三趟扫描后,可以保证class文件构成合理,内在一致,符合java语言的限制条件,并且可以被jvm安全的执行,如果检验没通过,jvm会抛出一个异常

第四趟:符号引用的验证
在动态连接的过程中,包含在class文件中的符号引用被解析时,class文件检验器将确保这个引用是正确的(由于这趟扫描必须检查当前class文件以外的类,所以可能需要装载新的类,大多数jvm使用延迟装载策略)
另外,第四趟检查还要检查相互引用的类之间的兼容性

读书人网 >编程

热点推荐