Java类装载过程

类装载过程由JVM类装载子系统负责,主要包括一下三个步骤:
1)装载:查找并装载类型的二进制数据到虚拟机中

1.通过某些途径,产生一个代表该类型的二进制数据流
2.解析二进制数据流为方法区的内部数据结构
3.在堆中创建一个表示该类型的Class实例(装载步骤的最终产品)

注意:Java虚拟机规范允许类装载器缓存Java类型的二进制表现形式,如果预装载出错,则要等待该类被主动使用时抛出LinkageError的子类的异常
2)连接:

1.验证 确保导入的类格式正确
    检查final类不能有子类,final方法不能被覆盖,常量池检查,字节码完整性检查...

注意:Java虚拟机设计者可以决定如何及时验证类型。Java虚拟机规范列出了虚拟机可以抛出的异常以及在何种条件下必须抛出它们

2.准备 为类变量分配内存,设置默认初始值
3.解析 把类型中的符号引用转换为直接引用(也可能推迟到真正需要使用某个符号引用时再去解析它)
    在类型的常量池中寻找类,接口,字段和方法的符号引用,把类型中的符号引用转换为直接引用

3)初始化:把类变量初始化为正确的初始值

1.如果类存在直接超类,且直接超类还没有初始化,则先初始化直接超类
2.如果类存在一个类初始化方法(“<clinit>”,并不是所有的类都存在这个方法,如果一个类没有类变量也没有静态初始化语句,就没有该方法),就执行它
所有的类变量初始化语句和类型的静态初始化器都被Java编译器收集在一起,放到一个特殊的方法(“<clinit>”)中,称为类初始化方法,此方法只能被Java虚拟机调用

所有的Java虚拟机实现必须在每个类或接口首次主动使用时初始化。有以下六种
1)当创建某个类的新实例时,或者在字节码中执行new指令,或者通过不明确的创建、反射、克隆或者反序列化时。
2)当调用某个类的静态方法时(即在字节码中执行invokestatic指令)
3)当使用某个类或接口的静态字段,或者对该字段赋值时(即在字节码中执行getstatic或putstatic指令时,用final修饰的静态字段除外,它被初始化为一个编译时的常量表达式)
4)当调用Java API的某些反射方法时,比如类Class中的方法或者java.lang.reflect包中的类的方法
5)当初始化某个类的子类时(除接口外)
6)当虚拟机启动时某个被表明为启动类(含有main方法)的类
除以上六种情形外,所有其它使用Java类型的方式都是被动使用,都不会导致Java类型的初始化

时间: 2024-12-20 09:02:44

Java类装载过程的相关文章

jvm的类加载器,类装载过程

混沌初开,在一片名为jvm的世界中,到处都是一片虚无,直到一个名为BootstrapClassLoader的巨人劈开了世界,据说它是由名叫C++的女神所造,它从一个叫做jre/lib的宝袋中拿出一把开天之斧ExtensionClassLoader,以及其他各种各样五颜六色的宝物,这些宝物撒落在混沌世界中,化作了山山水水.紧接着,巨人又使用ExtensionClassLoader这把巨斧劈开了一个叫做jre/lib/ext的巨峰,那里瞬间迸发出了五颜六色的彩芒,彩芒四溅而去,让这个灰色的世界不再那

[读书笔记]Java类载入过程

一. 类的生命周期 类从被载入到虚拟机内存中開始,到卸载出内存为止,有下面(如图)的生命周期: 以上"载入->验证->准备->解析->初始化"称为类的载入过程. Java虚拟机规范中没有对什么时候须要開始类载入的第一阶段进行强制约束,而是交给了虚拟机依据详细实现来自由把握. 可是对于初始化阶段,虚拟机有下面5种必须对类立即进行"初始化"的情况: (1)遇到new.getstatic.putstatic或invokestatic这4条字节码指令

Java 类初始化过程

     1  class X {      2     Y b = new Y();      3     X() {      4           System.out.print("X");      5     }      6  }      7         8  class Y {      9     Y() {     10           System.out.print("Y");     11     }     12  }    

Java虚拟机类装载的原理及实现(转)

Java虚拟机类装载的原理及实现(转) 一.引言 Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行.本文将分析JVM中的类装载系统,探讨JVM中类装载的原理.实现以及应用. 二.Java虚拟机的类装载实现与应用 2.1 装载过程简介 所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的c

深入研究Java类装在机制

目录 1.为什么要研究java类装在机制? 2.了解类装载机制,对于我们在项目开发中有什么作用? 3.装载实现细节. 4.总结 一.为什么药研究Java类装载机制 java类加载机制,便于我们使用自定义类加载器:深入理解,对于理解编译原理也有很大帮助. 二.了解类装载机制,在我们项目开始中的应用 在项目中,我们可以使用自定义类加载器,可以帮助我们做如下操作: (1)加密.java代码很容易被反编译,如果你需要把自己的代码进行加密,可以先将编译后的代码用某种加密算法加密,然后实现自己的类加载器,负

Java 对象创建过程

在某些项目中,会使用到静态块,构造器中初始化其他对象...深刻理解了java类初始化过程,这些将不在是问题. 那java对象的步骤是什么呢? 假设现在有People类,未显示继承任何其他类,初始化过程是这样的. 1 java 解释器必须查找类路径,以定位People.class文件.在首次创建对象时(构造器是静态方法),或people类的静态方法/静态域首次被访问时. 2 载入People.class,静态初始化的所有动作都会执行,且静态初始化只在Class对象首次加载的时候进行一次. 3 当使

java类中成员变量初始化后存放在堆内存中还是栈内存中?

答案是堆内存. 之前明明看过java类初始化过程的, 但一下子看到这样的题目,还是懵了. 百度后,那些帖子的回复各有各说, 脑袋都看得要塞住了,还是看书求证吧. 李刚的<疯狂Java>第128页开始,有一个类从初始化开始, 在内存发生什么变化的详细过程,这里简单记录一下. class Person{     String name;     static int eyeNum; } 上面这个Person类,有成员变量name和静态成员变量eyeNum了, 当执行下面语句: Person p1 

解析Java类和对象的初始化过程

类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来分析的文章更是鲜有所见. 本文主要对类和对象初始化全过程进行分析,通过一个实际问题引入,将源代码转换成 JVM 字节码后,对 JVM 执行过程的关键点进行全面解析,并在文中穿插入了相关 JVM 规范和 JVM 的部分内部理论知识,以理论与实际结合的方式介绍对象初始化和类初始化之间的协作以及可能存在的

Java中的类装载和初始化模块

在Java中,初始化模块是指用一对"{}"括起来的代码,可以与构造方法一起来对对象进行初始化.初始化模块又分为实例初始化模块和静态初始化模块(只能由类的静态成员引用,在类装载时进行调用) Java中,代码的执行顺序是: 1.装入类     1.1递归装入父类,直到继承链上的父类全部装入为止.     1.2类装入内存之后,静态数据域和静态初始块按照在类中出现的顺序进行执行. 2.调用类的构造方法     2.1递归调用父类的构造方法,直到父类为java.lang.Object为止.