最常见 300+ Java面试题解析 + 亿点点面试经验分享

2020-09-12  本文已影响0人  Java柚子

我坚信,机会永远属于有准备的人,我们与其羡慕他人的成功,不如从此刻起,积累足够多的知识和面试经验,为将来进入更好的公司做好充分的准备!

想让面试官在短短的几十分钟内认可你的能力?想在最短的时间内收获 Java 技术栈最核心的知识点?想要更全面更深入的了解 Java 技术?这篇文章给你想要的所有答案。

本文你将会获得以下知识:

Java、Jvm 最常见面试题解析;

Spring、Spring MVC、MyBatis、Hibernate 面试题解析;

MySQL、Redis 面试题解析;

RabbitMQ、Kafka、Zookeeper 面试解析;

微服务 Spring Boot、Spring Cloud 面试解析;

架构师全套视频教程 和关于java的系统化资料,包括java核心知识点、面试专题和20年最新的互联网真题、电子书等。

有需要的朋友可以加q群:1103806531  备注:简书   免费领取~

 JVM面试题

1.什么是 JVM?它有什么作用?

JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,顾名思义它是一个虚拟计算机,也是 Java 程序能够实现跨平台的基础。它的作用是加载 Java 程序,把字节码翻译成机器码再交由 CPU 执行的一个虚拟计算器。

2.JVM 主要组成部分有哪些?

JVM 主要组成部分如下:

类加载器(ClassLoader)

运行时数据区(Runtime Data Area)

执行引擎(Execution Engine)

本地库接口(Native Interface)

3.JVM 是如何工作的?

首先程序在执行之前先要把 Java 代码(.java)转换成字节码(.class),JVM 通过类加载器(ClassLoader)把字节码加载到内存中,但字节码文件是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine) 将字节码翻译成底层机器码,再交由 CPU 去执行,CPU 执行的过程中需要调用本地库接口(Native Interface)来完成整个程序的运行。

4.JVM 内存布局是怎样的?

不同虚拟机实现可能略微有所不同,但都会遵从 Java 虚拟机规范,Java 8 虚拟机规范规定,Java 虚拟机所管理的内存将会包括以下几个区域:

程序计数器(Program Counter Register)

Java 虚拟机栈(Java Virtual Machine Stacks)

本地方法栈(Native Method Stack)

Java 堆(Java Heap)

方法区(Methed Area)

5. JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots?

通过引用计数法和可达性分析法来确定垃圾。

(1)引用计数法: 为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加1,当引用失效时,计数器就减1,

当计数器为0时,则认为该对象可以被回收(由于引用计数法在循环引用时会导致内存泄露,目前在Java中已经弃用这种方式了)。

(2)可达性分析法:将“GC ROOT”对象作为起点,从这些节点向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。

Java中可以作为GC ROOT对象的有:虚拟机栈中引用的对象、方法区中的类静态属性引用的对象、方法区中常用引用的对象、本地方法栈中JNI引用的对象。

GC ROOT根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。

6. 说说 JVM串行回收、并行回收和并发回收的区别。

垃圾回收器从线程运行情况分类有三种:

串行回收:Serial回收器,单线程回收,全程stw;指使用单线程进行垃圾回收,垃圾回收时只有一个线程在工作,并且Java应用中的所有线程都要暂停工作等待垃圾回收的完成。这种现象称之为STW(stop-the-world)。

缺点:只有一个线程,执行垃圾回收时程序停止的时间比较长。对于交互性比较强的应用而言,这种垃圾收集器是不能被接收的。

并行回收:名称以Parallel开头的回收器,多线程回收,全程stw;指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。简答来说在串行垃圾收集器基础上做了改进,将单线程改为了多线程垃圾回收,这样可以缩短垃圾回收的时间。但是并行垃圾收集器在收集的过程中也会暂停应用程序,这个和串行垃圾回收器是一样的,只是并行执行速度快些,暂停的时间更短一些。

多个线程执行垃圾回收适合于吞吐量的系统,回收时系统会停止运行 高并发项目适合

并发回收:cms与G1,多线程分阶段回收,只有某阶段会stw;

指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替进行),用户程序在继续镜像,而垃圾收集程序运行于另一个CPU上。

7. 说说Java中的内存溢出和内存泄漏的区别。

内存泄漏:程序在申请内存后,无法释放已申请的内存空间。简单来说就是你用malloc或new申请了一块内存,但是没有及时将内存释放,导致这块内存一直处于占用状态。一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早被占光。

内存泄漏分为4类:

常发性内存泄漏:发生代存泄漏的代码会被多次执行到,每执行一次将会产生一次内存泄漏。

偶发性内存泄漏:发生内存泄漏只有在某些特定情况下或操作过程中才会发生。它和常发性内存泄漏是相对的,如果一直处于某一特定环境下,偶发性也会变成常发性。所以测试环境和测试方法对检测内存泄漏至关重要。

一次性内存泄漏:发生内存泄漏的代码只会执行一次,由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

隐式内存泄漏:程序在运行中不停的分配内存,但是直到结束时才释放内存。严格的说这里并没有发生内存泄漏,因为最终释放了所有申请的内存。但对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致耗尽系统的所有内存。所以我们称这类内存泄漏为隐式内存泄漏。

内存溢出:指程序在申请内存时,没有足够的内存空间供其使用,出现outofmemory。简单来说就是,你申请了10个字节的空间,

但是你在这个空间写入11或以上字节的数据,这样就会产生溢出。

由于篇幅有限,这里只展示一部分,有需要的朋友可以加q群:1103806531  备注:简书   免费领取~

面试经验分享—如何在面试中脱颖而出

在参加面试之前一定要对自己可能会用到的程序设计语言进行复习,要把自己最好的代码拿出来。因为编写代码是程序设计面试过程中的重头戏,是展示自己具备胜任有关工作的能力的机会。在解答程序设计面试题时的表现是大多数计算机公司和软件公司决定是否聘用某人的重要标准之一。程序实际面试题通常都有相当的难度。程序设计面试题一方面是要考验你编写代码的功力,另一方面是要考验你分析和解决问题的能力。大部分面试题基本上要用一个小时的实际才能得出答案,所以无法立刻找到面试题的解答方法是很正常的,千万不要因此而灰心丧气。

另外,在把题目弄清楚之前千万不要开始答题,从一个例子开始入手能进一步加深你对题目的理解。写完之后,要找个例子验证自己写出来的代码,并检查自己的代码是否把各种出错情况和特例都考虑周全了。

大多数技术类面试都会有一些非技术性的问题,这些问题一般会出现在整个面试过程的初期阶段,目的是为了确定你的工作经验和求职目标,看你能不能胜任有关职位。

非技术问题看起来都比较简单,尤其是当你已经在艰难的技术类测试中杀出重围的时候。但非技术问题也十分重要,千万不可掉以轻心。

最后,考官一般会告诉你一个时间给你回复,有时侯会没有回音,对于求职者,建议在面试结束后一周内,给考官联系,打电话或者 Email,表达一下感谢,捎带询问面试结果。当然可以表达对这个工作的热情。这一环节很多人忽略,公司在面试后也有可能流失一部分应聘者,善始善终或许会带来很大的转机。  不是每一个面试都很一帆风顺,如果一次失败了,应该注意总结一下这次的面试的经验教训,这样会为你以后的求职储存巨大的财富。相信每一个求职者不断努力,都会赢得自己钟爱工作。

最后

希望这篇文章对大家有帮助!

我这边也整理了一份 架构师全套视频教程 和关于java的系统化资料,包括java核心知识点、面试专题和20年最新的互联网真题、电子书等都有。

有需要的朋友可以加q群:1103806531  备注:简书   免费领取~

上一篇下一篇

猜你喜欢

热点阅读