• 技术文章 >Java >java教程

    从JVM分析Java的类的加载和卸载机制

    高洛峰高洛峰2017-01-13 09:35:51原创769
    从JVM分析Java的类的加载和卸载机制

    类的加载
      类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。

      加载.class文件的方式:

      1.从本地系统中直接加载

      2.通过网络下载.class文件

      3.从zip,jar等归档文件中加载.class文件

      4.从专有数据库中提取.class文件

      5.将Java源文件动态编译为.class文件

      类的加载的最终产品是位于堆区中的Class对象。

      Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

    从JVM分析Java的类的加载和卸载机制

    类加载器
      加载器有两种类型:

      1.Java虚拟器自带的加载器

      根类加载器(Bootstrap)

      扩展类加载器(Extension)

      系统类加载器或称应用加载器(System)

      后两种加载器是Java实现的,根类加载器是C++写的,程序员无法在Java代码中获得该类。

      2.用户自定义的类加载器

      java.lang.ClassLoader的子类

      用户可以定制类的加载方式

      类加载器并不需要等到某个类被首次主动使用时再加载它。

      JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError)。如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。

    类的卸载机制
    类的生命周期
      当Sample类被加载、连接和初始化后,它的生命周期就开始了。

      当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期。

      由此可见,一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。

    引用关系
      加载器和Class对象:

      在类加载器的内部实现中,用一个Java集合来存放所加载类的引用。

      另一方面,一个Class对象总是会引用它的类加载器。调用Class对象的getClassLoader()方法,就能获得它的类加载器。

      由此可见,Class实例和加载它的加载器之间为双向关联关系。

      类、类的Class对象、类的实例对象:

      一个类的实例总是引用代表这个类的Class对象。

      在Object类中定义了getClass()方法,这个方法返回代表对象所属类的Class对象的引用。

      此外,所有的Java类都有一个静态属性class,它引用代表这个类的Class对象。

    类的卸载
      由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。

      前面介绍过,Java虚拟机自带的类加载器包括根类加载器、扩展类加载器和系统类加载器。

      Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用它们所加载的类的Class对象,因此这些Class对象始终是可触及的。

      由用户自定义的类加载器加载的类是可以被卸载的。

    具体例子

    从JVM分析Java的类的加载和卸载机制

    loader1变量和obj变量间接应用代表Sample类的Class对象,而objClass变量则直接引用它。

      如果程序运行过程中,将上图左侧三个引用变量都置为null,此时Sample对象结束生命周期,MyClassLoader对象结束生命周期,代表Sample类的Class对象也结束生命周期,Sample类在方法区内的二进制数据被卸载。

      当再次有需要时,会检查Sample类的Class对象是否存在,如果存在会直接使用,不再重新加载;如果不存在Sample类会被重新加载,在Java虚拟机的堆区会生成一个新的代表Sample类的Class实例(可以通过哈希码查看是否是同一个实例)。

    更多从JVM分析Java的类的加载和卸载机制相关文章请关注PHP中文网!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java 类
    上一篇:深入解析Java中的Class Loader类加载器 下一篇:举例讲解Java的内部类与类的加载器
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• java实例解析之1M图片压缩优化到100kb• 详细解析java词法分析器DDL递归应用• 完全掌握Java动态代理• 简单归纳java线程池的四种创建方式• Java通过底层原码了解数组拷贝
    1/1

    PHP中文网