Java类加载机制(一)

什么是Java类加载机制

    虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程,就是虚拟机的类加载机制。
    类加载机制和类加载器,两个完全不同的概念。却经常让人傻傻分不清楚。类加载机制是阐述类是怎么被加载的,new,static,反射等等都会将类进行加载。类加载器就是我们通常所说的ClassLoader,它负责加载所有的类,当然也包括接口。当ClassLoader加载一个类之后,会在内存中生成一个java.lang.Class实例对象。如果类已经被加载到JVM中了,就是说JVM中已经生成了这个类的唯一标识。那么下次这个类再次实例化的时候是不会再生成新的java.lang.Class对象的。

Java类加载可以用来做什么

     掌握Java类加载机制,可以用来做什么?我们知道,Java天生以动态扩展的语言特性就是依赖运行期间动态加载和动态链接这个特性实现的。也就是说我们可以先定义好接口,等到具体运行的时候再指定具体的实现类。用户可以通过Java预定义的和自定义的类加载器,让一个本地的应用程序可以在运行时从网络或者其他地方加载一个二进制流作为程序的一部分。其实这种组装已经广泛的应用到了目前的Java程序中,比如最基础的Applet,JSP技术等都使用这种Java语言的运行时类加载的特性,当然我们还可以利用上述特性开发出我们自己程序,比如动态加载插件等等。了解类的加载机制可以让我们知道类是怎么加载进入JVM中的,这部分内容让我们知道类加载的生命周期包括了以下流程。




此处输入图片的描述




熟悉上述类的加载过程,让我在开发程序中,对程序优化,解决一些疑难杂症也是大有裨益的。 ## 类加载的过程(举例)     根据上图我们可以知道,类的生命周期有5个部分组成,分别为加载->链接->初始化->使用->卸载。这5个过程的加载顺序是确定的,但是我们可以看到链接部分又分为验证->准备->解析三个步骤,不过这三个步骤的顺序不是确定的。准确来说是解析这个步骤的顺序是不一定的。在某些时候,可能是在初始化之后在解析。那么什么时候触发类的加载呢?下面我们分阶段看每个步骤到底做了什么? ### 加载     加载是类加载过程的一个阶段,是第一个阶段。比如我们new一个新的类。我们就要对这个类进行初始化,当然初始化的方式还有很多种,这里就不一一介绍了。在初始化之前,我们需要加载和链接。在加载阶段,虚拟机需要完成下面三件事情

-通过一个类的全限定名来获取定义此类的二进制字节流。
-将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
-在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

验证

验证是链接的第一步,在这一步骤中主要是检查Class文件的字节流包含的信息对当前的虚拟机合法。比如验证文件格式,是否是以魔术0xCAFEBABE开头。
注册版本号是不是在虚拟机处理范围之类,等等。实际上验证的可不止这一点。验证的东西非常多,验证非常重要,可以保证虚拟机运行数据的准确性。
但是对于虚拟机而言,这一阶段确是确实不一定需要的。如果你能保证你运行的所有代码都是被反复验证和使用过的,那么在实施阶段就可以考虑关闭大部分类的验证措施。这种做法也的确在很多程序优化中做。的确可以做到缩短启动时间。

准备

准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,这些变量使用的内存在方法区进行分配。这个提到的类变量区别于实例变量。实例变量是分配到Java堆中的。这个阶段通常分配到的值是0值例如

   public static int value = 10;

上述的value在准备阶段被分配的是0而不是123,分配123要到程序的初始化阶段才执行。不过也不是绝对的。如一些变量的是具有final属性的。在准备阶段虚拟机就会根据这个属性给他设置值。比如:

   public static final int value = 10;

上述的这个10,就是在这个过程中进行赋值的。

解析

上文中提到过,解析阶段可能在初始化之后,也可能在初始化之前。那么解析阶段做了什么事事情呢?其实解析阶段就是将符号引用转换成直接引用。那什么是符号引用,什么是直接引用呢?

符号引用是一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用的时候可以无歧义的定位到目标就行。
直接引用是可以直接指向目标的指针,相对偏移量或是一个能够间接定义到目标的句柄。

通过定义我们可以看出解析过程就是把描述符转换成内存指针,解析动作主要针对类或者接口,字段,类方法,方法类型,接口方法,方法类型,方法句柄,调用点限定符。

初始化

类的初始化是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作都由虚拟机主导和控制。到了初始化阶段,才真正执行类中定义的Java程序代码。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值