类加载机制介绍
类最完整的一生应该是源码编译、类加载、字节码执行、对象回收4步,这篇说类加载,涉及到一些前置知识点,会分开多篇说,可以点链接跳转
一、类加载器
在讲类加载机制前,先了解亿下类加载器:类加载器介绍
二、jvm的启动、加载类过程
在介绍类生命周期的7个阶段前,先来看一下伴随着jvm虚拟机启动,类是在何时被加载的
1、jvm启动过程
(1) jvm初始化
包括装载jvm环境(linux是通过路径装载jvm.so)、解析jvm参数、申请堆内存
(2) 创建引导类加载器实例
申请好内存后,jvm会在堆中创建一个引导类加载器(Bootstrap Classloader)实例,这是最顶级的类加载器,是使用C++语言实现的(其他都是java)(所以java中调试这个类时为null)
BootstrapClassloader会读取"{JRE_HOME} / lib"下的jar包和配置,然后将这些系统类加载到元数据区(jdk1.8前是方法区)内(如java.lang.String, java.lang.Object等)
BootstrapClassloader这个引导类加载器从系统属性"sun.boot.class.path"所指定的目录中加载文件,它实现依赖于底层的操作系统,属于虚拟机的一部分,并没有实现java.lang.classLoader类
(3) 创建jvm启动器实例Launcher
jvm调用已经加载在元数据区的类sun.misc.Launcher的静态方法getLauncher(),获取 sun.misc.Launcher实例(单例模式)
在Launcher的构造函数执行后,ExtClassLoader和AppClassLoader这2个类加载器被创建
(4) 使用AppClassLoader加载自定义类
一、java类的生命周期
加载、连接(验证、准备、解析)、初始化、使用和卸载
java程序的加载、连接和初始化都是在程序运行期间完成的,这种运行期类加载的特性,虽然在java程序启动时增加一些开销,但是提供了高度的灵活性,可以动态加载和动态连接,比如可以等到运行时再指定具体的实现类,可以在运行时从网络或其他地方加载一个二进制流作为程序代码的一部分
二、加载
加载是类加载的第一步,在讲这个步骤之前,先要说明一下类加载器的概念
1、类加载器