开头
被面试人是我的一位粉丝近期刚刚结束了蚂蚁金服的三轮技术面试,面完之后他跟我说很累,直言不想再体验了。
他的面试经历我仔细看了看,一面重点在基础知识的考查,二面重点在项目以及对框架的使用与理解上,三面压力面,是很熟悉的套路,考察的知识点也是经常问到的,具有一定的参考价值,接下来我们就来看看他的这几轮面试经历吧。
一、Java 虚拟机架构 (JVM Architecture)
在我看来,不管学习什么样的知识或技术,首先要做的就是从全局上去认识它,这样才能避免盲人摸象,事倍功半的情况发生。既然要学习 JVM,就要先了解它的整体架构,于是我画了个 JVM 架构图来帮助大家认识它。
Java 虚拟机架构图
对 JVM 还不太了解的同学第一次看到这张花里胡哨的图肯定会一脸懵逼,不用怕,其实我们只需要重点理解并掌握其中一部分 (同时也是面试重点) 就好了,比如运行时数据区、垃圾收集器、内存分配策略和类加载机制等,类文件结构也可以学习一下,其他的稍作了解即可。既然本篇文章是要带领大家认识 JVM 架构的,那就先把图中各个部分都介绍一下吧 (注:本文只做介绍,让各位先对 JVM 有个整体的认识,后续会做深入探讨)。
1.1 Class 文件 (字节码文件)
Java 之所以号称“一次编写,处处运行”,就是得益于虚拟机和 Class 文件 (注:CLass 文件、字节码文件和类文件是一个意思) 的组合机制。程序员并不需要自己去适配不同的操作系统,大家都知道我们平时编写的 java 代码在编译成 Class 文件后才能执行,而 Class 文件可以在任何操作系统上的 JVM 上执行,这样就做到了“平台无关性”。下面是一个最简单的 HelloWorld 程序及其对应的 Class 文件。
HelloWorld 程序及其编译后的 Class 文件
得益于 Class 文件,JVM 还可以做到“语言无关性”,也就是说不只有 Java 程序可以运行于 JVM 之上,很多其他语言例如最近在安卓开发者中大火的 Kotlin 语言,还有 Scala、Groovy 等语言也都是基于 JVM 平台的,这些语言的代码都可以编译成 Class 文件,然后在 JVM 上运行。
JVM提供的平台无关性和语言无关性
1.2 类加载器子系统 (ClassLoader Subsystem)
要执行 Class 文件就需要先将其加载进内存,这一工作正是由类加载器 (ClassLoader) 完成的,系统为我们提供了三种类加载器,分别是启动类加载器 (Bootstrap ClassLoader)、扩展类加载器 (Extension ClassLoader) 和应用程序类加载器 (Application ClassLoader),如果有必要,我们也可以加入自定义的类加载器。类加载过程如下:
类加载过程
类加载过程分为加载、连接和初始化三个阶段,其中的连接阶段又分为验证、准备和解析三个阶段 (详细的类加载机制在后续文章中进行介绍)。
1.3 Java 虚拟机运行时数据区 (JVM Runtime Data Area)
这部分内容较多,放在本文第二部分单独进行介绍。
1.4 执行引擎 (Execution Engine)
字节码被加载进运行时数据区后,执行引擎会进行读取并执行,执行引擎主要包含以下模块