`

jvm_6_Class文件校验器

    博客分类:
  • jvm
 
阅读更多

 

 

1 功能:

 

a) 校验确认class文件内容有正确的结构

b) 在字节码执行之前对文件进行校验

 

2 具体执行过程:

 

a) 装载字节序列时,针对二进制数据进行校验,校验目的是确认class文件结构的合法性,如果校验失败会抛出异常

eg: 使用windowns下的copy命令去合并一个.class文件和一个jpg文件的时候,装载这个class文件的时候jvm会发现这个class文件被删改过,文件的长度也不正确,而抛出异常!

 

b) 扫描方法区目的是确认类能顺利编译,扫描范围为:方法区,针对语义,词法,语法进行分析

 

c)  字节码校验: 验证词法

c.1) 字节码流 

     字节码流 =  操作码+操作数

 

 

 

d)  符号应用校验: 即确认被引用的类,字段,方法确实存在

详细解释:

大部分JVM的实现都是使用延迟加载/动态链接,即:JVM加载类A,而A又引用B,

JVM不会加载B,而是将B相对于A的引用形式登记在符号表中,在真正使用到B时,才会将被引用类B在引用类A的符号引用名改为内存里的直接引用。

因为这个过程发生在方法区中,并且发生时间不可预测,因此这个过程也叫做动态连接。

 

总结下为:

1.查找被引用的类(有必要的话就加载它)

2.将符号引用替换为直接引用,例如一个指向类、字段或方法的指针,下次再需要用到被引用类的时候直接运用直接引用,不需要再去装载。

 

分析ClassLoader类中的loadClass方法,能找到动态连接的踪迹:

 

 protected synchronized Class<?> loadClass(String name, boolean resolve)  
02.throws ClassNotFoundException  
03.   {  
04.// First, check if the class has already been loaded  
05.Class c = findLoadedClass(name);  
06.if (c == null) {  
07.    try {  
08.    if (parent != null) {  
09.        c = parent.loadClass(name, false);  
10.    } else {  
11.        c = findBootstrapClass0(name);  
12.    }  
13.    } catch (ClassNotFoundException e) {  
14.        // If still not found, then invoke findClass in order  
15.        // to find the class.  
16.        c = findClass(name);  
17.    }  
18.}  
19.if (resolve) {  
20.    resolveClass(c);  
21.}  
22.return c;  
23.   }  

 

 loadClass有两个参数,第一个参数是类的全限定名,第二个参数就是我们要说的重点,这个参数为true的时候表示,loadClass方法会执行resolveClass的方法,这个方法就是将类中的符号引用替换为直接引用。最终调用的方法是一个本地方法 resolveClass0。

 

 

Class.forName这个静态的方法我们也常用来加载class文件的字节码,和classLoader.loadClass(String name, boolean resolve) 有什么区别
区别就在于是否执行resolveClass这个方法
Class.forName总是承诺将符号连接进行连接和初始化
loadClass没有这样的承诺, 需要参数来具体指定是否加载

 

 

 3  class文件校验器脑图:

 

 

 

 

 

 

  • 大小: 20.5 KB
分享到:
评论

相关推荐

    JVM之用Java解析class文件共10页.pdf.zi

    1. 类加载:JVM首先通过类加载器找到class文件,这个过程可能涉及到类路径的搜索、网络下载或动态生成等。Java提供了三种内置类加载器:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载...

    深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

    在Java编程中,类加载器(Class Loader)扮演着至关重要的角色,它负责查找并加载Java类到JVM内存中。本部分我们将深入探讨JVM中的类加载器,特别是根类加载器、扩展类加载器和系统类加载器。 首先,让我们了解类...

    JVM分享pdf

    JVM负责加载Class文件,校验字节码,以及执行字节码指令。Java虚拟机执行引擎负责执行字节码指令,它包括一个即时编译器(Just-In-Time,JIT)编译器和一个解释器。 4. **HotSpot VM**:HotSpot是JVM的一个高性能...

    JVM类加载过程.pptx

    JVM的类加载机制是JVM的核心机制之一,它把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初识化,形成可以被虚拟机直接使用的Java类型。 Java代码执行流程是JVM的核心流程之一,它首先通过...

    Java学习笔记

    - **字节码校验器**:检查字节码的正确性和安全性。 - **解释执行器**:逐行解释执行字节码。 2. **安全健壮** - Java设计了许多安全特性来确保应用程序的安全性,包括沙箱模型、类型安全等。 3. **面向对象*...

    JVM 规范(JDK7.0)

    主要描述了JVM结构组成、对编译后的class文件格式、对class文件的校验(class文件校验器)、jvm指令、JVM中对线程和锁的处理机制、以及sun虚拟机 的具体实现的优化(使用quick伪指令),对于想了解JVM运行细节,字节...

    Java6 JVM命令行参数

    - **功能描述**:在Class校验器中放松对访问控制的检查。类似于反射API中的`setAccessible(true)`方法,可以放宽对类成员的访问限制。 - **适用场景**:当需要绕过某些安全检查时,可以考虑启用该选项。但请注意,这...

    jvm类装载器原理

    《JVM类装载器原理详解》 Java的JVM(Java Virtual Machine)类装载器是Java运行时系统的重要组成部分,负责在程序运行期间查找并加载类的二进制数据。理解类装载器的工作原理对于优化Java应用性能和实现动态加载类...

    Java 6 JVM参数选项大全(中文版)

    - **功能**: 如果新的Class校验器检查失败,则回退使用旧的校验器。 - **背景**: JDK 6向下兼容到JDK 1.2,而这两个版本之间的Class信息存在较大差异,可能导致新的校验器无法正确处理旧版本的Class文件。 ##### -...

    JVM优化与OOM分析PPT

    1. **类加载器(ClassLoader)**:负责将.class文件加载到内存中,并对其进行校验和解析,最终转换成运行时的数据结构。 2. **运行时数据区(Runtime Data Area)**:包括方法区、堆、程序计数器、本地方法栈以及...

    JVM内存模型

    在JVM中,类加载器负责将描述类的数据从`.class`文件加载到内存中,并对其进行校验、转换解析及初始化,最终形成可以直接被虚拟机使用的Java类型。类加载器主要包括以下几种: - **Bootstrap ClassLoader**(引导类...

    JVM -XX 参数介绍

    - **功能**:如果新的Class校验器检查失败,则使用旧的校验器。 - **默认状态**:启用(针对Java 6)。 - **说明**:为了解决JDK6与早期版本的兼容性问题,当新校验器遇到无法识别的class文件时,会退回到旧校验...

    jvm笔记记录.docx

    - **验证**: 根据JVM规范,校验加载进来的`.class`文件是否符合规范,以防止JVM文件被篡改。 - **准备**: 给类的非`final`修饰的`static`变量分配内存空间,并进行默认初始化。 - **解析**: 将常量池内的符号引用...

    java虚拟机jvm

    类加载器负责寻找和加载类文件,通常是根据类名从类路径中找到对应的.class文件。 2. 验证:验证是确保加载的类文件符合Java语言规范,防止恶意代码破坏系统的安全机制。它检查字节码的语法、数据类型、操作符以及...

    Java的jvm相关知识点

    - 显式加载:通过类加载器的loadClass或Class.forName方法。 - 隐式加载:创建对象、访问类的属性或方法。 7. 静态代码块执行: - 类加载不一定会执行静态代码块,除非触发类初始化。 8. 主动加载与被动加载: ...

    开源项目-zxh0-jvm.go.zip

    1. 类加载器:负责加载.class文件,解析类信息并存储在内存中。 2. 字节码解析:将Java字节码转换为可执行的指令序列。 3. 运行时数据区:模拟Java的堆、栈、方法区等内存区域,执行指令时所需的上下文。 4. 操作数...

Global site tag (gtag.js) - Google Analytics