类加载器

本文详细阐述了Java中类加载器的工作原理,包括引导类加载器、扩展类加载器和系统类加载器的作用,以及类加载过程中的全盘负责、委托机制和缓存机制。了解这些机制对于深入理解Java运行时环境至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类加载器

  类加载器负责将 .class 文件(可能在磁盘上, 也可能在网络上) 加载到内存中, 并为之生成对应的 java.lang.Class对象

  Java中,不同的类,可能由不同的类加载器加载。

  当 JVM 启动时,会形成由三个类加载器组成的初始类加载器层次结构: 
    
                类加载器之间的父子关系和管辖范围图

Java的类加载器有三层:
  1)BootStrap加载核心类库(最先)
  2)ExtClassLoader加载非核心的辅助类库(其次)
  3)AppClassLoader加载每个应用自已的类库(最后)
  每个Java程序运行都需要启用上述三个类加载器

   1、bootstrap classloader--BootStrap
  bootstrap classloader:引导(也称为原始)类加载器,它负责加载Java的核心类。这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。
  可以通过执行以下代码来获得bootstrap classloader加载了那些核心类库:
1 URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs(); 
2 for (int i = 0; i < urls.length; i++) { 
3     System.out.println(urls[i].toExternalForm()); 
4 } 

  因为JVM在启动的时候就自动加载它们,所以不需要在系统属性CLASSPATH中指定这些类库

   2、extension classloader--ExtClassLoader
    extension classloader -扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中的JAR包。
    这为引入除Java核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的,所以放入这个目录的 JAR类包对所有的JVM和system classloader都是可见的。
   3、system classloader--AppClassLoader
   system classloader - 系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径。
  可以通过静态方法ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。
  
  
                      JVM加载String类型字节码[上图]
 
                        栈堆内存的变化[上图]
 
 
 全盘、负责、委托机制
 classloader 加载类用的是全盘负责委托机制
 1、全盘负责:即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的其它Class通常也由这个classloader负责载入。
        也就是当加载一个非核心非辅助的类库时,如果涉及到其他的类,都由该AppClassLoader全盘负责加载。
 
2、委托机制:先让parent(父)类加载器寻找,只有在parent找不到的时候才从自己的类路径中去寻找。即当加载一个类时,首先由父加载器依次加载,如果所有的父加载器都加载不到,最后再由自已加载。
3、类加载还采用了cache机制:如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么修改了Class但是必须重新启动JVM才能生效,并且类只加载一次的原因。 即当加载一个类时,如果事先缓存中有对应的字节码,则直接取来用;如果没有,再临时加载,完成后依然放入到缓存中,以使下次重用。
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值