zoukankan      html  css  js  c++  java
  • JAVA之了解类载入器Classloader

    1、类的载入、连接和初始化  

    类初始化通常包含载入、连接、初始化三个步骤。

     

    1)进程的结束

    每当执行一个java程序时,将会启动一个java虚拟机进程,无论程序多么复杂。有多少线程。都在这个java虚拟机进程里。下面四种情况会使得该进程被终止——

    • 程序执行到最后正常结束;
    • 程序里遭遇了System.exit(),或者是Runtime.getRunTime().exit()代码。
    • 程序执行中遇到了未捕获的异常或者错误;
    • java所在平台强制结束了JVM进程;

     

    当该进程结束,那么该进程在内存中的状态将会丢失。包含静态变量的值。

    2)类的载入

    类的载入是指将类的class文件读入内存。并为之创建一个java.lang.class对象。

     

    3)类的连接

    类的连接负责把类的二进制数据合并到JRE中,分为三个阶段——

    • 验证:检验被载入的类是否有正确的内部结构;
    • 准备:负责为类的静态Field分配内存,并设置默认初始值。
    • 解析:将类的二进制数据中的符号应用替换成直接引用。

     

    4)类的初始化

    类的初始化。主要就是对静态Field进行初始化。

     

    2、类载入器

     

    1)类载入器简单介绍

    类载入器负责载入全部的类。系统为全部载入内存里的类都会生成一个java.lang.class对象。

    同一个类仅仅会被载入一次,在JVM中每个不同的类都会有一个不同的类载入器负责。

    类载入器在不包含用户自己定义的载入器的情况下包含三层:

     

    • Bootstrap Classloader根载入器;
    • ExtensionClassloader扩展类载入器。
    • System ClassLoader系统类载入器。

     

    根载入器,又称为引导或者原始载入器,负责载入java的核心类;

    扩展类载入器,负责载入JRE的扩展文件夹中JAR包的类。

    系统类载入器。又称为应用载入器。负责JVM启动时载入来自java命令的-classpath或者CLASSPATH环境变量所指定的JAR包和类路径。通常是程序执行的当前路径。所以其称为应用类载入器。

    三个类载入器的顺序是:

          bootstrap classloader

                   |

          extension classloader

                   |

          system classloader

    假设实用户自己定义的类载入器,那么在系统载入器后。将会执行用户类载入器。

     

    2)自己定义类载入器

    假设我们须要在启动类载入时作一些特定需求的行为,那么就须要自己定义类载入器了。

    自己定义ClassLoader须要继承ClassLoader抽象类,重写findClass方法,这种方法定义了ClassLoader查找class的方式。

    主要能够扩展的方法有:

    findClass         定义查找Class的方式

    defineClass      将类文件字节码载入为jvm中的class

    findResource   定义查找资源的方式

     

    3)类载入机制

    JVM的类载入机制有下面三种:

    • 全盘负责:

    所谓全盘负责。即是当一个classloader载入一个Class的时候,这个Class所依赖的和引用的全部 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入。

     

    • 父类托付:

    所谓父类托付。就是先让父类载入器先尝试载入该Class,当父类无法载入的时候。才是尝试从自己的类路径中去载入。

    JVMClassLoader採用的是树形结构,除了BootstrapClassLoader以外。每个ClassLoader都会有一个parentClassLoader,即父类载入器,用户自己定义的ClassLoader默认的parendClassLoaderSystemClassLoader,当然你能够自己指定须要用哪一个ClassLoader的实例

     

    • 缓存机制:

    所谓缓存机制就是保证全部载入过的类都会被缓存。当程序中须要某个类时,会先从缓存区中搜查该类,当缓存区不存在该类对象时,系统才会读取该类的二进制文件。

     

  • 相关阅读:
    织梦精准搜索自定义字段搜索证书查询
    织梦一个标签获取当前链接url(首页/列表页/列表分页/内容页/内容页分页)
    织梦dede:arclist按最新修改排序orderby=pubdate无效的解决方法
    织梦likearticle让mytypeid支持多个栏目和子栏目
    织梦站内选择和文件管理器中文乱码的解决方法(utf8编码程序包才会)
    WPFDispatcher示例
    WPF 核心体系结构
    WPF扩展标记
    WPF 路由事件
    WPF 自定义路由事件
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10972500.html
Copyright © 2011-2022 走看看