struts启动时加载_类加载器机制

类加载机制

类加载器种类:

  • 启动类加载器
  • 扩展类加载器
  • 系统类加载器
a3a1881aea105e03e41ee4ad848bf565.png

启动类加载器和扩展类加载器没有父类加载器,而系统类加载器的父类加载器是扩展类加载器,自定义类加载器父类加载器则是扩展类加载器

所谓的类加载:就是创建.class文件对应的class对象,并将class文件加载到内存的过程。

类加载过程主要分为三步:

1、加载:查找类的.class文件,并创建class对象

2、链接:分三小步:

  • 验证:验证class文件中信息是否符合虚拟机要求;
  • 准备:静态变量分配内存和设置初始化值,不包括final 修饰的静态变量,final变量在编译的时候就会初始化、也不包括实例变量,静态变量即类变量,会分配在方法区中,而实例变量随对象一起分配到堆中;
  • 解析:将常量池中的符号引用替换为直接引用,即替换为直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄;

3、初始化:若有父类,初始化父类,执行静态初始化器、静态变量(准备阶段只是赋予了默认值)、以及成原变量初始化。

ClassLoader源码分析

loadClass 方法用于加载class文件,这里类加载机制设涉及到双亲委派机制。

双亲委派机制:即子类加载器收到类加载请求时,会提交给父类加载器处理,如果父类加载器上面还有父类加载器,则继续递归,找到最终的父类加载器加载,当父类加载器加载类失败时,才会由子类加载器中的 findClass() 方法去加载。

双亲委派机制的目的是:

1、这种带有优先级的层次关系,可以避免类被重复加载,当父类加载器加载过,子类就不用加载;

2、保证类加载的安全性:比如核心的Api库被篡改,父类加载器加载,会直接报错。

protected Class> loadClass(String name, boolean resolve) throws ClassNotFoundException {    synchronized (getClassLoadingLock(name)) {    // 首先查寻该类是否已经被加载    Class> c = findLoadedClass(name);    if (c == null) {        long t0 = System.nanoTime();        try {            //如果类未被加载,且存在父类加载器,那么根据双亲委派机制,寻找父类加载器加载            //如果不存在父类加载器,则寻找启动类加载器来加载            if (parent != null) {                c = parent.loadClass(name, false);            } else {                c = findBootstrapClassOrNull(name);            }        } catch (ClassNotFoundException e) {            // ClassNotFoundException thrown if class not found            // from the non-null parent class loader        }        if (c == null) {            //c==null 说明父类/启动类加载器未找到该class,此时调用findClass()方法            long t1 = System.nanoTime();            //此findClass方法会交由子类去实现,即父类加载器加载失败时,由子类加载器负责去加载            c = findClass(name);            // this is the defining class loader; record the stats            sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);            sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);            sun.misc.PerfCounter.getFindClasses().increment();         }     }     if (resolve) { //是否解析该类,调用的是native方法            resolveClass(c);      }       return c;    } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值