类加载机制

目录

运行时数据区

在这里插入图片描述

类生命周期

在这里插入图片描述

类加载器

先有C后有java。应用程序加载器,就是加载开发人员编写的代码。
在这里插入图片描述

验证问题

在这里插入图片描述

查看类对应的加载器

核心类库:String、Object等都属于核心类库。
在这里插入图片描述

/**
 * 查看类的加载器实例
 */
public class ClassLoaderView {
    public static void main(String[] args) throws Exception {
        // 加载核心类库的 BootStrap ClassLoader
        System.out.println("核心类库加载器:"
                + ClassLoaderView.class.getClassLoader().loadClass("java.lang.String").getClassLoader());
        // 加载拓展库的 Extension ClassLoader
        System.out.println("拓展类库加载器:" + ClassLoaderView.class.getClassLoader()
                .loadClass("com.sun.nio.zipfs.ZipCoder").getClassLoader());
        // 加载应用程序的
        System.out.println("应用程序库加载器:" + ClassLoaderView.class.getClassLoader());

        // 双亲委派模型 Parents Delegation Model
        System.out.println("应用程序库加载器的父类:" + ClassLoaderView.class.getClassLoader().getParent());
        System.out.println(
                "应用程序库加载器的父类的父类:" + ClassLoaderView.class.getClassLoader().getParent().getParent());
    }
}

结果

核心类库加载器:null
拓展类库加载器:sun.misc.Launcher$ExtClassLoader@6f94fa3e
应用程序库加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
应用程序库加载器的父类:sun.misc.Launcher$ExtClassLoader@6f94fa3e
应用程序库加载器的父类的父类:null

JVM如何知道我们都类在何方

在这里插入图片描述

类不会重复加载

类名一样,代表同一个类。在次情况下,类被修改,不会重复加载。
在这里插入图片描述

类的卸载

有些情况会用到动态生成类的过程。
在这里插入图片描述

双亲委派模型

模型只是一种行为都约束。
父子关系是一种上下级关系,逻辑定义的,目的是为了委派。
每一个类加载器都有一个具体的搜索目录,具体的位置,这个位置存储了类的信息,一个类不会去重新加载一个类。
每一个类加载器首先不会尝试自己去加载,而是委派给父类来加载。如果没有指定,则会以ExtClassLoader和Bootstarp作为逻辑上的附加载器。
这种模型目的是为了降低
重复加载的问题
,也是为了安全问题考虑。例如你用一个别人的jar包,如果别人写了Object被加载了,没有实现对应方法,就会很诡异。
热加载功能:通过不断创建新的类加载器来加载修改后的类。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值