首页 > 数据库 > 数据库开发技术 > 上海携程Java高级面试题-1
1、描述一下 JVM 载 加载 Class 文件的原理机制?

三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java 采用了委托模型机制。

注意一个很重要的问题,就是 Java 在逻辑上并不存在 BootstrapKLoader 的实体!因为它是用 C++编写的,所以打印其内容将会得到 null。
前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:
a.装载:查找和导入 class 文件;
b.连接:

c. 初始化:初始化静态变量,静态代码块

2. 什么是类加载器
类加载器是一个用来加载类文件的类。Java 源代码通过 javac 编译器编译成类文件。然后 JVM 来执行类文件中的字节码来执行程序。类加载器负责加载文件系统、网络或其他来源的类文件。
3. 类加载器有哪些
有三种默认使用的类加载器:Bootstrap 类加载器、Extension 类加载器和Application 类加载器。每种类加载器都有设定好从哪里加载类。
Bootstrap 类加载器负责加载 rt.jar 中的 JDK 类文件,它是所有类加载器的父加载 器 。 Bootstrap 类加载器没有任何父类加载器,如果你调用String.class.getClassLoader(),会返回null,任何基于此代码会抛出NullPointException异常。Bootstrap加载器被称为初始类加载器。
而 Extension 将加载类的请求先委托给它的父加载器,也就是 Bootstrap,如果没有成功加载的话,再从 jre/lib/ext 目录下或者 java.ext.dirs 系统属性定义的目录下加载类。Extension 加载器由sun.misc.Launcher$ExtClassLoader 实现。
第三种默认的加载器就是 Application 类加载器了。它负责从 classpath 环境变量中加载某些应用相关的类,classpath 环境变量通常由-classpath 或-cp 命令行选项来定义,或者是 JAR 中的 Manifest 的 classpath 属性。Application 类加 载 器 是 Extension 类 加 载 器 的 子 加 载 器 。 通 过sun.misc.Launcher$AppClassLoader 实现。
4. 什么是 tomcat 类加载机制?
在 tomcat 中类的加载稍有不同,如下图:

当 tomcat 启动时,会创建几种类加载器:
a、 Bootstrap 引导类加载器
加载 JVM 启动所需的类,以及标准扩展类(位于 jre/lib/ext 下)
b、System 系统类加载器
加载 tomcat 启动的类,比如 bootstrap.jar,通常在 catalina.bat 或者
catalina.sh 中指定。位于 CATALINA_HOME/bin 下
c、 Common 通用类加载器
加载 tomcat 使用以及应用通用的一些类,位于 CATALINA_HOME/lib 下,比如 servlet-api.jar
d 、webapp 应用类加载器
每个应用在部署后,都会创建一个唯一的类加载器。该类加载器会加载位于WEB-INF/lib 下的 jar 文件中的 class 和 WEB-INF/classes 下的 class 文件。
当应用需要到某个类时,则会按照下面的顺序进行类加载:
① 使用 bootstrap 引导类加载器加载
② 使用 system 系统类加载器加载
③ 使用应用类加载器在 WEB-INF/classes 中加载
④ 使用应用类加载器在 WEB-INF/lib 中加载
⑤ 使用 common 类加载器在 CATALINA_HOME/lib 中加载

原文作者:IT枫斗者;如有侵权,请联系管理员删除。