类的生命周期
一个类的生命周期分为五个阶段,分别是:加载、链接、初始化、使用、卸载。其中链接又可以分为验证、准备、解析三个步骤。

类加载器的分类
JVM角度
从 JVM 的角度来讲,只存在两种不同的类加载器:
- 启动类加载器(BootstrapClassLoader),使用 C++实现,是JAVA虚拟机自身的一部分。
- 其它类的加载器,使用 Java 实现,独立于虚拟机,继承自抽象类 java.lang.ClassLoader。
开发人员角度
启动类加载器(BoostrapClassLoader):最顶层的加载类,由 C++ 实现,主要用来加载 JDK 内部的核心类库(%JRE_HOME%\lib 目录下的 rt.jar、resources.jar、charsets.jar 等 jar 包和类)以及被 -Xbootclasspath 参数指定的路径下的所有类。
拓展类加载器(ExtensionClassLoader):该加载器由sun.misc.Launcher$ExtClassLoader 来实现,它主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下所有的类。
应用程序类加载器(ApplicationClassLoader):该加载器由 sun.misc.Launcher$AppClassLoader 来实现,它是面向我们用户的加载器,它负责加载当前应用 ClassPath 下所有的 jar 包和类。开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
类加载过程
- 通过权限定名来获取二进制字节流
- 验证文件格式
- 验证元数据
- 验证程序语义
- 验证符号
- 将字节流中的静态数据结构转化为方法区中的运行数据结构
- 在java堆中生成一个代表这个类的对象,
- 初始化类
类加载机制
jvm的类加载采用双亲委派机制。所谓双亲委派就是当一个 类加载器 需要加载类时,把加载请求向上委托,交给父类加载器来加载,如果父类还存在父类则继续向上委托,直到委托到启动类加载器:BootstrapClassLoader,当父类加载失败则交给子类自己处理。
这里要说明一下:在JDK9之前是有扩展类加载器的,在JDK9开始移除了扩展类加载器,更改为平台类加载器。JDK9开始还有一点修改的的是应用类加载器如果没有归属的平台类加载器,则会直接委派给启动类加载,如果有归属的平台类加载器,则会优先委派给平台类加载器。

1万+

被折叠的 条评论
为什么被折叠?



