JVM 加载 class 文件原理?【详细介解】

今天爱分享给大家带来JVM 加载 class 文件原理?【详细介解】,希望能够帮助到大家。
【参考答案】
所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这
个类或是这个接口的 class 对象的过程. 在 Java 中,类装载器把一个类装入 Java 虚拟机中,要经过三个步骤来完成:装载、链
接和初始化,其中链接又可以分成校验、准备、解析
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化 Java 代码和静态 Java 代码块
JVM 中类的装载是由 ClassLoader 和它的子类来实现的,Java ClassLoader 是一个重要的
Java 运行时系统组件。它负责在运行时查找和装入类文件的类
一个 Java 应用程序使用两种类型的类装载器:根装载器(bootstrap)和用户定义的装载器
(user-defined)。
根装载器以某种默认的方式将类装入,包括那些 Java API 的类。在运行期间一个 Java 程
序能安装用户自己定义的类装载器。根装载器是虚拟机固有的一部分,而用户定义的类装载
器则不是,它是用 Java 语言写的,被编译成 class 文件之后然后再被装入到虚拟机,并像
其它的任何对象一样可以被实例化。 Java 类装载器的体系结构如下所示:

Java 的类装载模型是一种代理(delegation)模型。当 JVM 要求类装载器 CL(ClassLoader)
装载一个类时,CL 首先将这个类装载请求转发给他的父装载器。只有当父装载器没有装载并
无法装载这个类时,CL 才获得装载这个类的机会。这样, 所有类装载器的代理关系构成了
一种树状的关系。树的根是类的根装载器(bootstrap ClassLoader) , 在 JVM 中它以
“null”表示。除根装载器以外的类装载器有且仅有一个父装载器。在创建一个装载器时, 如
果没有显式地给出父装载器, 那么 JVM 将默认系统装载器为其父装载器
下面针对各种类装载器分别进行详细的说明:
根(Bootstrap) 装载器:该装载器没有父装载器,它是 JVM 实现的一部分,从
sun.boot.class.path 装载运行时库的核心代码。
扩展(Extension) 装载器:继承的父装载器为根装载器,不像根装载器可能与运行时的
操作系统有关,这个类装载器是用纯 Java 代码实现的,它从 java.ext.dirs (扩展目录)
中装载代码。
系统(System or Application) 装载器:装载器为扩展装载器,我们都知道在安装
JDK 的 时 候 要 设 置 环 境 变 量 (CLASSPATH ) , 这 个 类 装 载 器 就 是 从
java.class.path(CLASSPATH 环境变量)中装载代码的,它也是用纯 Java 代码实现的,同
时还是用户自定义类装载器的缺省父装载器。
小应用程序(Applet) 装载器: 装载器为系统装载器,它从用户指定的网络上的特定目
录装载小应用程序代码。

人已赞赏
Java

JAVA 事件有哪些模式?【面试题详解】

2020-12-2 15:00:13

Java

SOCKET 中有几中连接方式,各有什么区别?【面试题详解】

2020-12-2 15:16:06

'); })();