ITPub博客

首页 > 数据库 > 数据库开发技术 > 上海携程Java高级面试题-1

上海携程Java高级面试题-1

原创 数据库开发技术 作者:IT枫斗者 时间:2021-03-01 10:20:13 0 删除 编辑

1、描述一下 JVM 载 加载 Class 文件的原理机制?

Java 中的所有类,都需要由类加载器装载到 JVM 中才能运行。类加载器本身也是一个类,而它的工作就是把 class 文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。
Java 类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到 jvm 中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。
Java 的类加载器有三个,对应 Java 的三种类:

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

委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其 Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到 jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。
我们可以通过这样的代码来获取类加载器:

注意一个很重要的问题,就是 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枫斗者;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
大家好,我是枫哥,🌟阿里云技术专家、📝资深面试官、🌹Java跳蚤网课堂创始人。技术交流vx:itfdz666,拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。看面试实战视频可以关注b站号:IT枫斗者–Java面试。需要看技术文章,可以关注CSDN:IT枫斗者。

注册时间:2020-05-13

  • 博文量
    183
  • 访问量
    81334