Python知识分享网 - 专业的Python学习网站 学Python,上Python222
《剑指offer》JVM面试题总结
匿名网友发布于:2024-01-18 11:15:36
(侵权举报)
(假如点击没反应,多刷新两次就OK!)

《剑指offer》JVM面试题总结   图1

 

 

 

 

资料内容:


加载
关于什么时候开始加载这个过程,《Java 虚拟机规范》并没有强制约束,所以这一点我们可以
自由实现。加载是整个类加载过程的第一个阶段,在这个阶段,Java 虚拟机需要完成三件事
情:
• 通过一个类的全限定名来获取定义此类的二进制字节流。
• 将这个字节流表示的一种存储结构转换为运行时数据区中方法区的数据结构。
• 在内存中生成一个 Class 对象,这个对象就代表了这个数据结构的访问入口。
《Java 虚拟机规范》并未规定全限定名是如何获取的,所以现在业界有很多获取全限定名的方
式:
• 从 ZIP 包中读取,最终会改变为 JAR、EAR、WAR 格式。
• 从网络中获取,最常见的应用就是 Web Applet。
• 运行时动态生成,使用最多的就是动态代理技术。
• 由其他文件生成,比如 JSP 应用场景,由 JSP 文件生成对应的 Class 文件。
• 从数据库中读取,这种场景就比较小了。
• 可以从加密文件中获取,这是典型的防止 Class 文件被反编译的保护措施。
加载阶段既可以使用虚拟机内置的引导类加载器来完成,也可以使用用户自定义的类加载器来完
成。程序员可以通过自己定义类加载器来控制字节流的访问方式。
数组的加载不需要通过类加载器来创建,它是直接在内存中分配,但是数组的元素类型(数组去
掉所有维度的类型)最终还是要靠类加载器来完成加载。
验证
加载过后的下一个阶段就是验证,因为我们上一步讲到在内存中生成了一个 Class 对象,这个
对象是访问其代表数据结构的入口,所以这一步验证的工作就是确保 Class 文件的字节流中的
内容符合《Java 虚拟机规范》中的要求,保证这些信息被当作代码运行后,它不会威胁到虚拟
机的安全。
验证阶段主要分为四个阶段的检验:
• 文件格式验证。
• 元数据验证。
• 字节码验证。
• 符号引用验证。
文件格式
文件格式验证
这一阶段可能会包含下面这些验证点:
• 魔数是否以 0xCAFEBABE 开头。
• 主、次版本号是否在当前 Java 虚拟机接受范围之内。
• 常亮池的常量中是否有不支持的常量类型。
• 指向常量的各种索引值中是否有指向不存在的常量或不符合类型的常量。
• CONSTANT_Utf8_info 型的常量中是否有不符合 UTF8 编码的数据。
• Class 文件中各个部分及文件本身是否有被删除的或附加的其他信息。
实际上验证点远远不止有这些,上面这些只是从 HotSpot 源码中摘抄的一小段内容。
元数据
元数据验证
这一阶段主要是对字节码描述的信息进行语义分析,以确保描述的信息符合《Java 语言规
范》,验证点包括
• 验证的类是否有父类(除了 Object 类之外,所有的类都应该有父类)。
• 要验证类的父类是否继承了不允许继承的类。
• 如果这个类不是抽象类,那么这个类是否实现了父类或者接口中要求的所有方法。
• 是否覆盖了 final 字段,是否出现了不符合规定的重载等。
需要记住这一阶段只是对《Java 语言规范》的验证。

字节码验证
字节码验证阶段是最复杂的一个阶段,这个阶段主要是确定程序语意是否合法、是否是符合逻辑
的。这个阶段主要是对类的方法体(Class 文件中的 Code 属性)进行校验分析。这部分验证包

• 确保操作数栈的数据类型和实际执行时的数据类型是否一致。
• 保证任何跳转指令不会跳出到方法体外的字节码指令上。
• 保证方法体中的类型转换是有效的,例如可以把一个子类对象赋值给父类数据类
型,但是不能把父类数据类型赋值给子类等诸如此不安全的类型转换。
• 其他验证。
如果没有通过字节码验证,就说明验证出问题。但是不一定通过了字节码验证,就能保证程序是
安全的。