jvm的类加载方式分为隐式加载和显示加载两种。隐式加载指的是程序在使用new关键词创建对象时,会隐式的调用类的加载器把对应的类加载到jvm中。显示加载指的是通过直接调用class.forName()方法来把所需的类加载到jvm中。
在java语言中,类的加载是动态的,他并不会一次性将所有的类全部加载后再运行,而是保证程序运行的基础类完全加载到JVM中,至于其他类,则在需要的时候才加载。(一方面是为了提高加载速度,一方面可以节约程序运行过程中对内存的开销)。在java语言中,可以把类分为3类:系统类、扩展类、自定义类。Java针对这3种不同的类提供了3种类型的加载器,这3种类型加载器的关系如下:
Bootstrap ClassLoader:负责加载系统类(根)
Extension ClassLoader:负责加载扩展类(中间)
ApplicationClassLoader:负责加载应用类(底)
以上这3个类是通过双亲委派模型来完成类的加载的。具体而言,就是当有类需要被加载时,类加载器会请求父类来完成这个载入工作,父类会使用自己的搜索路径来搜索需要被载入的类,如果搜索不到,才会由子类按照其搜索路径来搜索待加载的类。
类加载步骤如下:
1) 加载:根据查找路径找到相应的class文件,然后导入。类的加载方式分为
隐式加载和显示加载两种。隐式加载指的是程序在使用new关键词创建对象时,会隐式的调用类的加载器把对应的类加载到jvm中。显示加载指的是通过直接调用class.forName()方法来把所需的类加载到jvm中。
2) 检查:检查夹加载的class文件的正确性。
3) 准备;给类中的静态变量分配内存空间。
4) 解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址。
5) 初始化:对静态变量和静态代码块执行初始化工作。
6)使用
7)卸载:
由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。
自带的类加载器包括根类加载器、扩展类加载器和系统类加载器。
Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用它们所加载的类的Class对象,因此这些Class对象始终是可触及的。
由用户自定义的类加载器加载的类是可以被卸载的。
类需要满足以下3个条件才能算是“无用的类”
1. 该类所有的实例已经被回收
2. 加载该类的ClassLoder已经被回收
3. 该类对应的java.lang.Class对象没有任何对方被引用
在我的项目中,写了一个工具类(util)来封装jdbc的方法(注册数据库驱动,建立连接等)。用配置文件保存URL,用户名,密码,驱动类等。(配置文件解耦)当在工具类中想要用properties类读取配置文件时,将该代码放在静态代码块状,证每次加载工具类只会之类加载配置文件一次。用prop.load方法加载配置文件资源时,不用直接写路径的方法,用类加载器加载。因为工具类以后可能会放在其他应用当中。所以用类加载器加载,只要把配置文件放在SRC目录下,无论在什么工程中,都能找到。原理是在类加载器目录下找,配置文件就在类目录下。