简述java类加载机制?
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初 始化,最终形成可以被
虚拟机直接使用的java类型。
描述一下JVM加载Class文件的原理机制
Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也 是一个类,而它的工作就
是把class文件从硬盘读取到内存中。在写程序的时 候,我们几乎不需要关心类的加载,因为这些都是隐
式装载的,除非我们有特殊 的用法,像是反射,就需要显式的加载所需要的类。
类装载方式,有两种 :
1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用 类装载器加载对应的类到
jvm中,
2.显式装载, 通过class.forname() 等方法,显式加载需要的类
Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证 程序运行的基础类(像是
基类)完全加载到jvm中,至于其他类,则在需要的时候 才加载。这当然就是为了节省内存开销。
什么是类加载器,类加载器有哪些?
实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。 主要有一下四种类加载器:
1. 启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被 java程序直接引用。
2. 扩展类加载器(extensions class loader): 它用来加载 Java 的扩展库。 Java 虚拟机的实现会提供一
个扩展库目录。该类加载器在此目录里面查找 并加载 Java 类。
3. 系统类加载器(system class loader ):它根据 Java 应用的类路径 (CLASSPATH )来加载 Java
类。一般来说,Java 应用的类都是由它来 完成加载的。可以通过
ClassLoader.getSystemClassLoader()来获取 它。
4. 用户自定义类加载器,通过继承 java.lang.ClassLoader类的方式实
现。
说一下类装载的执行过程?
类装载分为以下 5个步骤:
加载:根据查找路径找到相应的 class 文件然后导入;
验证:检查加载的 class 文件的正确性;准备:给类中的静态变量分配内存空间;
解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为 一个标示,而在直接引
用直接指向内存中的地址;
初始化:对静态变量和静态代码块执行初始化工作。
什么是双亲委派模型?
在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都需要由加载它的 类加载器和这个类本身
一同确立在 JVM 中的唯一性,每一个类加载器,都有一 个独立的类名称空间。类加载器就是根据指定全
限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。
类加载器分类:
启动类加载器(Bootstrap ClassLoader),是虚拟机自身的一部分,用来加载 Java_HOME/lib/目
录中的,或者被 -Xbootclasspath 参数所指定的路径中并且被虚 拟机识别的类库;
其他类加载器:
扩展类加载器(Extension ClassLoader):负责加载\lib\ext目录或Java. ext. dirs系统变量指
定的路径中的所有类库;
应用程序类加载器(Application ClassLoader)。负责加载用户类路径 (classpath)上的指
定类库,我们可以直接使用这个类加载器。一般情况,如果我 们没有自定义类加载器默认就
是用这个加载器。
双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去加载 这个类,而是把这个请
求委派给父类加载器去完成,每一层的类加载器都是如 此,这样所有的加载请求都会被传送到顶层的启
动类加载器中,只有当父加载无 法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会
尝试去加 载类。当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父 类,由父类去加载,如果 文章来源:https://www.toymoban.com/news/detail-446515.html
此时父类不能加载,反馈给子类,由子类去完成类的加 载。 文章来源地址https://www.toymoban.com/news/detail-446515.html
到了这里,关于java类加载机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!