zoukankan      html  css  js  c++  java
  • Java开发基础知识之学习篇——类加载机制

      虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

    1、类加载过程

      类的生命周期如下:

       1、加载

      “加载”是“类加载机制”的第一个过程,在加载阶段,虚拟机主要完成三件事

      (1)通过一个类的全限定名来获取其定义的二进制字节流

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

      (3)在堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。

      相当于类加载的其他阶段而言,加载阶段是可控性最强的阶段,因为程序员可以使用系统的类加载器加载,还可以使用自己的类加载器加载。

       2、验证

       验证是连接阶段的第一步,此阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全

      (1)文件格式验证:验证.class文件字节流是否符合class文件的格式规范,并且能够被当前版本的虚拟机处理。这里面主要对魔数、主版本号、常量池等的校验。

      (2)元数据验证:主要是对字节码描述的信息进行语义分析,以保证其描述的信息符合java语言规范的要求。比如验证这个类是不是有父类,类中的字段方法是不是和父类冲突等等。

      (3)字节码验证:这是整个验证过程最复杂的阶段,主要是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。例如保证跳转指令不会跳转到方法体以外的字节码指令上。

      (4)符合引用验证:在解析阶段中发生,保证可以将符合引用转化为直接引用。

      3、准备

      为类变量分配内存并设置类变量初始值,这些变量所使用的内存都将在方法区中进行分配。

      (1)类变量(static)会分配内存,但是实例变量不会,实例变量主要随着对象的实例化一块分配到java堆中

      (2)这里的初始值指的是数据类型默认值,而不是代码中被显示赋予的值。

      4、解析

      虚拟机将常量池内的符号引用替换为直接引用的过程

        符合引用:以一组符合来描述所引用的目标,可以是任何形式的字面量,只要是能无歧义的定位到目标就好,好比在班级中,老师可以用张三来代表你,也可以用学号代表你,但是无论任何形式都是一个代号,这个代号指向你(符合引用)

       直接引用:直接引用是可以指向目标的指针、相对偏移量或者是一个能直接或间接定位到目标的句柄。和虚拟机有关,不同的虚拟机直接引用一般不同。 

       5、初始化

      这个阶段,java程序代码才开始真正执行。在准备阶段已经为类变量赋过一次值,在初始化阶段,程序猿可以根据自身需求来赋值了。就是执行类构造器<init>() 方法的过程。

       在初始化阶段,主要为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。两种方式

      (1)声明类变量是指定初始值

      (2)使用静态代码块为类变量指定初始值  

      JVM初始化步骤

      (1)假如这个类还没有被加载和连接,则程序先加载并连接该类

      (2)假如该类的直接父类还没有被初始化,则先初始化其直接父类

      (3)假如类中有初始化语句,则系统依次执行这些初始化语句

       

  • 相关阅读:
    洛谷—— P3353 在你窗外闪耀的星星
    洛谷—— P1238 走迷宫
    洛谷—— P1262 间谍网络
    9.8——模拟赛
    洛谷—— P1189 SEARCH
    算法
    May 22nd 2017 Week 21st Monday
    May 21st 2017 Week 21st Sunday
    May 20th 2017 Week 20th Saturday
    May 19th 2017 Week 20th Friday
  • 原文地址:https://www.cnblogs.com/cokeHuan/p/12442877.html
Copyright © 2011-2022 走看看