`
不平凡的人
  • 浏览: 35233 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

类加载的过程

 
阅读更多

本文从以下方法介绍类加载过程:

一、类加载时机

二、类加载过程

 

一、类加载时机

       类从加载到虚拟机内存开始,到从虚拟机内存卸载出为止,生命周期如下:

       加载(Loading)

       验证(Verification)

       准备(Preparation)

       解析(Resolution)

       初始化(Initialization)

       使用(Using)

       卸载(Unloading)

 

注意:加载,验证,准备,初始化,卸载,5个阶段的顺序是确定的。

           验证、准备、解析阶段也称为连接阶段。

           解析阶段的顺序不一定,可能会在初始化阶段之后,这是为了支持java语言的动态绑定。

 

 

1、加载

      对于类加载过程中的第一个阶段:加载,虚拟机规范中没有明确的规定强制约束加载时机,而是有虚拟机具体实现自由把握。

 

2、初始化

      虚拟机规范明确规定有且只有4中情况立即对类进行初始化(而加载、验证、准备还是要在初始化之前执行)

 

     (1)遇到new、getstatic、putstatic、invokestatic这4条字节码指令时,如果类未初始化,则立即进行初始化。

 

     (2)使用java.lang.reflact包中的方法对类进行反射调用的时候,如果类未进行初始化,则需要先出发其初始化。

 

     (3)如果初始化一个类时,如果其父类还未进行初始化,则先初始化其父类。

 

    (4)当虚拟机启动时,用户指定一个执行的主类(包含main()方法的类),虚拟机会先初始化该类。

 

 二、类加载过程

        类加载的全过程包括加载、验证、准备、解析、初始化五个阶段。

 

1、加载

      “类加载”过程的第一个阶段为“加载”。

       
      加载过程虚拟机执行的操作:

      (1)通过类的全限定名(包名+类名)来获取此类的二进制字节类。

      (2)将该字节流所代表的静态存储结构转为方法区运行时数据结构。

      (3)在堆中生成一个java.lang.Class的字节码文件对象,作为访问方法区数据的入口。

 

  2、验证

        为连接阶段的第一步,该步骤的目的是为了确保class文件中包含的信息符合当前虚拟机的要求。

       

       (1)文件格式的验证:

                验证字节流是否符合class文件的格式规范,并且能否被当前版本的虚拟机处理。

                 该阶段的验证部分包括:

                 ①魔数;

                 ②次版本;

                 ③主版本;

                 ④常量池中的常量是否有不被支持的常量类型;

         

       (2)元数据的验证:

                对字节码的描述信息进行语义分析,确保描述信息符合java语言的规范要求。

                该阶段验证部分如下:

                ①该类是否有父类,(除了java.lang.Object之外);

                ②如果有继承关系,父类是否被final修饰;

                ③如果类不是抽象类或接口,是否实现其父类或接口中的所有方法;

                ④类中的字段、方法是否与父类产生冲突,如:重写父类中的final方法;

 

       (3)字节码验证

                进行数据流和流分析;对类中的方法进行校验和分析。

                ①保证任意时刻操作数栈中的数据类型与指令码序列都能配合工作;

                ②保证跳转的指令不会跳转到方法体以外的字节码指令上;

 

        (4)符合引用的验证

                校验虚拟机将符号引用转为直接引用的时候信息正确性,该动作在解析阶段发生。

                校验内容如下:

                ①符号引用对应的字符串所表示的全限定名是否能够找到对应的类;

                ②符号引用中的类、字段、方法的访问性(private...)是否可被当前类访问;

 

3、准备

      准备阶段正式为类变量(static变量)赋初始值,这些内存在方法区中分配。此阶段并未进行类变量的显示初始化赋值。

       如:private static int i =123; 该阶段初始值为0而不是123。

       特殊情况: 

              private static int i =123;     

              javac将i的值生成ConstantValue属性,则再准备阶段虚拟机会根据ConstantValue的设置将i赋值为123。

 

4、解析

      解析阶段虚拟机将常量池中的符号引用直接替换为直接引用的过程。

      符号引用:符号引用通过一组符号来描述目标,符号引用可以是任何形式的字面量。符号引用与虚拟机                            的内存分布无关,引用的目标不一定需要加载到内存。

      直接引用:直接指向目标的指针,相对偏移量或一个能够间接定位目标的句柄。直接引用虚拟机的内存                            布局有关,如果有直接引用,则表示目标一定在内存中。

      ①类或接口的解析

      ②字段的解析

      ③类方法的解析        

      ④接口方法的解析

 

5、初始化

      类加载过程中的最后一个阶段,准备阶段已经为类变量进行默认初始化赋值,则该阶段为类变量进行显示初始化赋值。

     初始化的阶段是执行类构造器<client>的过程。

     

 

 

 

 

  本文参考自 《深入理解Java虚拟机》 周志明

  • 大小: 90.9 KB
  • 大小: 64.5 KB
分享到:
评论

相关推荐

    第23讲请介绍类加载过程,什么是双亲委派模型1

    Java 类加载过程是Java程序运行时的关键环节,它涉及到如何将类的字节码加载到JVM中并准备执行。整个过程可以分为五个主要步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和...

    weblogic类加载过程简述

    下面我们将详细探讨WebLogic的类加载过程。 1. **类加载器层次结构** WebLogic的类加载器体系遵循“父类加载器优先”原则,这意味着当一个类加载请求发生时,首先由父类加载器尝试加载,只有在其无法找到相应类时...

    JVM类加载过程.pptx

    JVM类加载过程 JVM(Java Virtual Machine)是Java语言的核心组件之一,它是Java语言的可移植性和跨平台性的基础。JVM主要组成部分包括类加载子系统、执行引擎、本地方法接口和运行时数据区。 类加载子系统是JVM的...

    SpringBoot 类加载过程,源码分析

    SpringBoot 类加载过程详解 在深入探讨Spring Boot的类加载过程之前,让我们先理解一下类加载的基本概念。Java中的类加载是由JVM(Java虚拟机)执行的,它负责将类的字节码加载到内存中,进行校验、解析,并准备类...

    java类加载过程详解.doc

    Java 类加载过程是Java虚拟机(JVM)在运行时动态加载类的机制,它涉及类的生命周期中的几个关键步骤,包括装载、连接、初始化和卸载。下面将详细阐述这些过程。 1. 装载 装载阶段是类加载的起始点,主要分为三个...

    JVM(三):类加载机制(类加载过程和类加载器)1

    类加载器在类加载过程中扮演重要角色,它负责找到类的字节流并将其转换为运行时可用的形式。系统提供了几个内置类加载器,如Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和...

    Java虚拟机类加载顺序

    类加载过程主要包括三个阶段:加载、链接和初始化。 - **加载**:类加载器读取类文件数据并转换为二进制流加载到内存中。 - **链接**:包括验证、准备和解析三个子阶段。验证确保加载的类符合Java语言规范;准备...

    Java虚拟机----类的加载过程.docx

    Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...

    类加载器加载过程.rar

    类加载过程包括三个主要阶段:加载、验证、准备、解析和初始化。 1. 加载:类加载器读取类的二进制数据,这些数据通常来自.class文件,也可能来自网络、数据库或其他数据源。 2. 验证:确保加载的类数据符合Java...

    java类加载器

    #### 二、类加载过程 类加载过程主要包括三个步骤: 1. **加载**:通过类的全限定名找到该类的二进制字节流。 2. **连接**: - **验证**:确保加载的类文件符合JVM规范,包括字节流文件的格式正确性、元数据的...

    深入研究Java类加载机制 深入研究Java类加载机制

    类加载过程涉及到类的加载、链接(验证、准备、解析)、初始化等阶段,并且这一过程是由类加载器系统完成的。 #### 二、类加载器系统 Java中的类加载器系统主要包括以下几种类型的类加载器: 1. **Bootstrap ...

    自定义类加载器实现自定义加载

    - 类加载过程分为三个阶段:加载、验证、准备、解析和初始化。在加载阶段,类加载器寻找并加载类的二进制数据。 - Java中的类加载器采用双亲委派模型,即一个类首先由启动类加载器Bootstrap ClassLoader尝试加载,...

    类加载的工具

    类加载工具则是辅助开发者理解和分析类加载过程的实用程序。这些工具可以帮助我们定位类的来源,查看加载顺序,以及优化应用的性能。 标题中的“类加载的工具”可能指的是用于监控和分析类加载过程的各种工具。在...

    Java类加载器原理

    Java 类加载器原理 Java 类加载器是Java虚拟机...类加载器的机制保证了Java的类加载过程是有序且安全的,同时也支持了Java的动态加载和模块化特性。在自定义类加载器时,需要遵循这些规则,以便正确地扩展JVM的功能。

    Java类加载内幕详细讲解

    #### 五、类加载过程详解 类加载的过程主要分为三个阶段:加载(Loading)、连接(Linking)和初始化(Initialization)。 1. **加载**(Loading): - 类加载器查找并加载类的二进制流。 - 创建`java.lang....

    Java类加载原理解析

    当遇到`java.lang.ClassNotFoundException`异常时,通常是因为类加载过程出现了问题。了解类加载机制对于解决这类问题至关重要,同时也有助于深入理解Java虚拟机(JVM)的工作原理。 Java 类加载机制主要由类加载器...

    JVM类加载机制详细讲解

    类加载过程中可能会遇到一些问题,如类冲突、类循环依赖等。类冲突通常发生在不同加载器加载了相同包名下的类,导致版本不一致。类循环依赖则可能引发无限递归,使得类加载失败。解决这些问题通常需要对类加载器的...

    Java类加载器.pdf

    类加载过程包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)五个阶段。其中,初始化阶段会执行类的静态代码块,这是`Class.forName()`方法中`...

Global site tag (gtag.js) - Google Analytics