失效链接处理 |
2020年携程Java高级笔试面试题 PDF 下载
本站整理下载:
提取码:nrj6
相关截图:
主要内容:
1. 描述一下 JVM 加载 Class 文件的原理机制?
在面试 java 工程师的时候,这道题经常被问到,故需特别注意。
Java 中的所有类,都需要由类加载器装载到 JVM 中才能运行。类加
载器本身也是一个类,而它的工作就是把 class 文件从硬盘读取到内
存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都
是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加
载所需要的类。
Java 类的加载是动态的,它并不会一次性将所有类全部加载后再运
行,而是保证程序运行的基础类(像是基类)完全加载到 jvm 中,至于
其他类,则在需要的时候才加载。这当然就是为了节省内存开销。
Java 的类加载器有三个,对应 Java 的三种类:
三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完
成呢?为了解决这个问题,Java 采用了委托模型机制。
委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其 Parent(即上一
层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其
实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机
制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到 jvm,委托模型机制会搜
索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。
我们可以通过这样的代码来获取类加载器:注意一个很重要的问题,就是 Java 在逻辑上并不存在 BootstrapKLoader 的实
体!因为它是用 C++编写的,所以打印其内容将会得到 null。
前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:
1.装载:查找和导入 class 文件;
2.连接:
3. 初始化:初始化静态变量,静态代码块。
来源:https://www.cnblogs.com/wenjiang/archive/2013/04/26/3044132.html
2. 什么是类加载器?
类加载器是一个用来加载类文件的类。Java 源代码通过 javac 编译器编译成类
文件。然后 JVM 来执行类文件中的字节码来执行程序。类加载器负责加载文件
系统、网络或其他来源的类文件。
3. 类加载器有哪些?
有三种默认使用的类加载器:Bootstrap 类加载器、Extension 类加载器和
Application 类加载器。每种类加载器都有设定好从哪里加载类。Bootstrap 类加载器负责加载 rt.jar 中的 JDK 类文件,它是所有类加载器的父加
载 器 。 Bootstrap 类 加 载 器 没 有 任 何 父 类 加 载 器 , 如 果 你 调 用
String.class.getClassLoader() , 会 返 回 null , 任 何 基 于 此 的 代 码 会 抛 出
NullPointerException 异常。Bootstrap 加载器被称为初始类加载器。
|