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的实例

     

    • 缓存机制:

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

     

  • 相关阅读:
    springboot springcloud zuul 过滤器
    springboot springcloud eureka 熔断器
    javaweb servlet filter
    maven nexus 搭建私服(二)
    springboot springcloud zuul 网关入门
    springboot springcloud 配置中心
    springboot springcloud eureka 入门
    java rabbitmq
    java jvm调优
    maven nexus 搭建私服(一)
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10972500.html
Copyright © 2011-2022 走看看