JAVA-类加载机制(2)-类加载的过程

类的加载过程

一,加载

定义:获取.class文件的字节流,转为方法区的数据结构,在内存中创建Class对象作为该类的数据访问入口

内容:【1】,根据类的全限定名获取二进制字节流

     【2】,根据字节流代表的静态存储结构转化为方法区的运行时数据结构

   【3】,在内存中生成该类的java.lang.Class对象,作为方法区该类的数据访问入口(注:内存指的不一定是堆, 如HotSpot虚拟机是存放在方法区)

从.class文件获取字节流方式:

   【1】,zip包读取 如:jar,ear,war等格式文件

   【2】,网络获取 如:Applet

   【3】,运行时计算生成 如:动态代理,java.lang.reflect.Proxy中使用ProxyGenerator.generateProxyClass为特定接口生成形式为"*$Proxy"的代理类的二进制字节流

   【4】,其他文件 如:jsp文件生成对应的Class类

   【5】,数据库 如:中间件服务器SAP Netweaver

其他:

  ①,类加载过程中,在内存中创建Class对象,这里的内存不一定是堆内存,根据虚拟机而定,如:HotSpot虚拟机是存放在方法区

  ②,加载阶段和连接阶段交叉进行,加载未结束连接阶段的字节码验证可能就开始了

  ③,类加载可以分为非数组类和数组类加载

    非数组类:通过1,系统提供的类加载器  2,用户自定义的类加载器(重写类加载器的loadClass方法)

    数组类:不使用类加载器创建,由虚拟机直接创建

    数组类创建规则:1.如果数组组件是引用类型,数组会在加载该引用类型的类加载器的类名称上进行标识

            2.如果数组组件不是引用类型,java虚拟机将数组标记为和引导类加载器关联

            3.数组可见性和它的组件类型一致,如不是不是引用类型默认是public

二,验证(连接)

定义:对Class文件的字节流包含的信息进行验证是否符合虚拟机要求,避免危害虚拟机安全

为什么需要验证:Class文件不一定都是Java源码编译而来,例如:使用十六进制编辑器直接编写Class文件,而这些非Java源码编译而来的Class文件不一定格式正确

内容:【1】,文件格式验证  (文件)

         检查字节流是否符合Class文件格式规范,是否能被当前版本的虚拟机处理

如: ①,是否已魔数0xCAFEBABE开头

②,主次版本是否在当前虚拟机处理范围之内

            ③,常量池是否有不支持的常量类型

          ④,指向常量的索引值是否指向不存在的常量和不符合类型的常量

           ⑤,CONSTANT_Utf8_info型的常量是否符合UTF8编码

                  ... ...

    【2】,元数据验证  (数据类型)

      对字节码信息进行语义分析,是否符合Java语言规范

       如:①,是否有父类(除java.lang.Object)

          ②,父类是否继承了不允许被继承的类(final修饰类)

            ③,非抽象类是否实现了父类和接口中要求实现的所有方法

          ④,类的字段和方法是否和父类出现冲突(如:覆盖父类final字段,错误的重载等)

            ... ...

    【3】,字节码验证  (方法)

        通过数据流和控制流分析,确定程序语义是否合法

        如:①,操作数栈的数据类型与指令代码序列都能配合工作不会出现类型不一致的情况

          ②,跳转指令不会跳转到方法体外

          ③,方法体内的类型转换是有效的,如将父类对象赋值给子类数据类型是不合法的

        关闭StackMapTable对于字节码验证优化配置:

             -XX:-UseSplitVerifier

           -XX:+FailOverToOldVerifier

     【4】,符号引用验证

        对类自身以外的信息进行匹配性校验

        目的:确保解析动作能正常执行

         发生的时间:解析阶段中虚拟机将符号引用转为直接引用的时候进行符号引用验证 

        校验内容:①,符号引用中通过字符串描述的全限定名是否能找到对应的类

                   ②,指定类中是否存在符合方法的字段描述符以及简单名称所描述的方法和字段

               ③,符号引用中的类,字段,方法的访问性是否可被当前类访问

               ... ...

        可能的错误:java.lang.NoSuchFieldError, java.lang.NoSuchMethodError等

三,准备(连接)

定义:为类的静态变量在方法区分配内存,设置初始零值

    

其他:

public static final int value = 123;   //准备阶段:设置为123

public staitc int value = 123;          //准备阶段:设置为0,将value赋值为123的putstatic指令编译后存放于类构造器<clinit>()方法中, 初始化阶段:设置为123

时间: 2024-10-13 17:02:37

JAVA-类加载机制(2)-类加载的过程的相关文章

jvm之java类加载机制和类加载器(ClassLoader)的详解

当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化. 一.类加载过程 1.加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象. 类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是前面所有程序运行的基础

一文读懂Java类加载机制

Java 类加载机制 Java 类加载机制详解. @pdai Java 类加载机制 类的生命周期 类的加载:查找并加载类的二进制数据 连接 验证:确保被加载的类的正确性 准备:为类的静态变量分配内存,并将其初始化为默认值 解析:把类中的符号引用转换为直接引用 初始化 使用 卸载 类加载器, JVM类加载机制 类加载器的层次 寻找类加载器 类的加载 JVM类加载机制 自定义类加载器 参考文章 类的生命周期 其中类加载的过程包括了加载.验证.准备.解析.初始化五个阶段.在这五个阶段中,加载.验证.准

JVM的类加载机制

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类加载的过程: 包括加载.链接(含验证.准备.解析).初始化 如下图所示: 1.加载: 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,作为方法区这个类的数据访问的入口. 也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象.具体包括以下三个部分: (1)通过类的全

JVM学习笔记三:JVM类加载机制

概述 Class文件最终需要加载到虚拟机中之后才能运行和使用.虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用.卸载 7个阶段.其中验证.准备.解析部分统称为连接.七个阶段发生顺序如下: java中,类型的加载.连接和初始化过程都是在程序运行期间完成的.加载.验证.准备.初

转载---虚拟机类加载机制

虚拟机类加载机制  虚拟机把描述的类的数据从class文件加载到内存后,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制.  类加载的时机 类被加载到虚拟机内存开始,到卸载出内存为止.它的整个生命周期包括:类加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)7个阶段.其中验证,准备,解析

JVM之类加载机制

JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口.注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类). 验证 这一阶

JVM类加载机制一

类加载的过程 什么是类加载?Java编译器会将我们编写好的代码编译成class字节码文件,JVM会把这些class字节码文件加载到内存中,并对加载的数据进行校验.准备.解析并初始化,这个过程就是类加载机制.类加载分为三个阶段:加载,连接,初始化. 这三个阶段都是在程序运行期间完成的.其中加载,校验,准备,初始化,卸载的顺序都是确定的,解析可能会在初始化之后完成. JVM 可以选择符号引用解析的时机,一种是当类文件加载并校验通过后,这种解析方式被称为饥饿方式.另外一种是符号引用在第一次使用的时候被

深入理解Java:类加载机制及反射

一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能. 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 2.工作机制 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示

JAVA 初识类加载机制 第13节

JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行.这些过程都是我们看不见的,我们能看见的也就是一个.class文件.既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些.class文件呢?虚拟机获得这些.class文件的过程就是类加载了. 所以,总结来说就是:虚拟机将.class文件从磁盘或者其他地

JVM类加载机制详解(一)JVM类加载过程

首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默认初值?什么时候会为变量赋程序设定的初值? 5.类加载器是什么? 6.如何编写一个自定义的类加载器? 首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class).而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验.转换解析.初始化,使这些数