热门话题白皮书HR资料
Java面试必会高频考题
2024.02.02


本文干货满满,建议好好看哦~


进程与线程的区别:


答:进程与线程之间的主要区别可以总结如下。


  • 进程是一个“执行中的程序”,是系统进行资源分配和调度的一个独立单位

  • 线程是进程的一个实体,一个进程中一般拥有多个线程。线程之间共享地址空间和其它资源(所以通信和同步等操作,线程比进程更加容易)

  • 线程一般不拥有系统资源,但是也有一些必不可少的资源(使用ThreadLocal存储)

  • 线程上下文的切换比进程上下文切换要快很多。


JVM中的内存是怎么划分的?


答:JVM中的内存主要划分为5个区域,即方法区,堆内存,程序计数器,虚拟机栈以及本地方法栈。下边是Java虚拟机运行时数据区示意图:



方法区:方法区是一个线程之间共享的区域。常量,静态变量以及JIT编译后的代码都在方法区。主要用于存储已被虚拟机加载的类信息,也可以称为“永久代”,垃圾回收效果一般,通过-XX:MaxPermSize控制上限。


堆内存:堆内存是垃圾回收的主要场所,也是线程之间共享的区域,主要用来存储创建的对象实例,通过-Xmx 和-Xms 可以控制大小。


虚拟机栈(栈内存):栈内存中主要保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量。每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。栈中的栈帧随着方法的进入和退出有条不紊的执行着出栈和入栈的操作。


程序计数器:程序计数器是当前线程执行的字节码的位置指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,是内存区域中唯一一个在虚拟机规范中没有规定任何OutOfMemoryError情况的区域。


本地方法栈:主要是为JVM提供使用native 方法的服务。


解析:


JVM的内存划分主要由以上五个区域组成,我们需要重点掌握堆内存,栈内存以及方法区域的定义和作用,做到准确理解与阐述。


JVM垃圾回收算法有哪些?


答:HotSpot 虚拟机采用了root根搜索方法来进行内存回收,常见的回收算法有标记-清除算法,复制算法和标记整理算法。


标记-清除算法(Mark-Sweep):


标记-清除算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,并且会产生内存碎片。



复制算法:


复制算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。复制算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。



标记-整理算法:


标记-整理算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。



解析:


垃圾回收算法是垃圾收集器的算法实现基础,年轻代垃圾回收一般采用复制算法,老年代垃圾回收一般采用标记-清除和标记-整理算法。希望大家对照着算法示意图,对算法的原理与过程加以理解与掌握。接下来,我们一起来看垃圾回收算法的具体实现,那就是垃圾收集器吧。


Java中的类加载机制有了解吗?


答:Java中的类加载机制指虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换、解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。


类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用、卸载七个阶段。类加载机制的保持则包括前面五个阶段。


加载:


加载是指将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。


验证:


验证的作用是确保被加载的类的正确性,包括文件格式验证,元数据验证,字节码验证以及符号引用验证。


准备:


准备阶段为类的静态变量分配内存,并将其初始化为默认值。假设一个类变量的定义为public static int val = 3;那么变量val在准备阶段过后的初始值不是3而是0。


解析:


解析阶段将类中符号引用转换为直接引用。符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。


初始化:


初始化阶段为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。


解析:


关于类加载机制的考察也是JVM知识点的重中之重,上边我们介绍了类加载机制的过程以及其基本作用。接下来,我们看下类加载器有哪几种呢?类加载器的职责又是什么呢?


类加载器的分类:


启动类加载器(Bootstrap ClassLoader):


启动类加载器负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的类。


扩展类加载器(ExtClassLoader):


扩展类加载器负责加载JDK\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类)。


应用类加载器(AppClassLoader):


应用类加载器负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器。


类加载器的职责:


全盘负责:


当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显式使用另外一个类加载器来载入。


父类委托:


类加载机制会先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。


父类委托机制是为了防止内存中出现多份同样的字节码,保证java程序安全稳定运行。


缓存机制:


缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。这就是为什么修改了Class后,必须重启JVM,程序的修改才会生效。


TCP和UDP协议的区别?


答:TCP和UDP协议都是传输层常见的协议,它们的主要区别如下所示:


  • TCP协议进行数据通信之前需要三次握手建立连接,UDP协议不需要建立连接即可发送数据。

  • TCP有确认机制,丢包可以重发,保证数据的正确性;UDP不保证正确性,只是单纯的负责发送数据包。

  • TCP协议可能会对大数据包进行拆分,并且在接收方进行重组数据包操作;UDP协议是面向报文的,不会进行分片和重组,所以需要注意传输的报文大小。

  • 网络包中的TCP头部为20个字节;UDP头部只有8个字节。


解析:


这也是一道几乎必考的面试题目,我们必须清楚的阐述是否需要三次握手以及传输是否可靠,即是否有确认机制。


既然说到了丢包重传机制,那么请注意SACK (Selective ACK),SACK是TCP选项,它使得接收方能告诉发送方哪些报文段丢失,哪些报文段重传了,哪些报文段已经提前收到等信息,根据这些信息TCP就可以只重传哪些真正丢失的报文段。


UDP协议的应用:


UDP协议由于传输不需要建立连接,资源消耗较小。常用在视频或者语音传输中,域名解析服务DNS都使用了UDP协议。


前面我们提到了TCP头部以及UDP头部所占大小,那么接下来让我们看看一个完整的网络数据包都包括哪些模块吧~


MySQL常见的存储引擎有哪些?


答:MySQL中最常见的存储引擎有InnoDB和MyISAM,它们的主要区别如下:


  • MyISAM不支持事务;InnoDB是事务类型的存储引擎。

  • MyISAM只支持表级锁;InnoDB支持行级锁和表级锁,默认为行级锁。

  • MyISAM引擎不支持外键;InnoDB支持外键。

  • 对于count(*)查询来说MyISAM更有优势,因为其保存了行数。

  • InnoDB是为处理巨大数据量时的最大性能设计的存储引擎。

  • MyISAM支持全文索引(FULLTEXT);InnoDB不支持。


总结:


最主要的区别就是MyISAM表不支持事务、不支持行级锁、不支持外键。InnoDB表支持事务、支持行级锁、支持外键。


解析:


对MySQL的存储引擎的考察也是一个几乎必考的知识点,为了让大家对存储引擎有一个更好的了解,我们先来看下MySQL的基本逻辑架构图,从整体上了解下MySQL包括哪些逻辑架构。



由MySQL的逻辑架构图我们可以看出,逻辑架构包括Server层和存储引擎层。其中Server层包括连接器,分析器,优化器以及执行器;存储引擎层包括多种支持的存储引擎。各个逻辑部件的作用如下:


  • 连接器:验证客户端权限,建立和断开MySQL连接

  • 分析器:进行SQL语句的语法分析

  • 优化器:选择索引,生成具体的SQL语句执行计划

  • 执行器:操作存储引擎,执行SQL,返回执行结果

  • 存储引擎层:各个不同的存储引擎都提供了一些读写接口来操作数据库


好了,我们接着说存储引擎的知识点,在MySQL5.5.5版本之后,InnoDB已经成为了其默认的存储引擎,也是大部分公司的不二选择,毕竟谁家公司会不要求数据库支持事务呢?谁家公司又可以忍受表级锁导致的读写冲突呢?


除了InnoDB以及MyISAM存储引擎外,常见的考察存储引擎还有Memory,使用Memory作为存储引擎的表也可以叫做内存表,将数据存储在了内存中,所以适合做临时表来使用,在索引结构上支持B+树索引和Hash索引。


MySQL事务有哪些特性?


答:事务是单个逻辑工作单元执行的一系列操作,是一个不可分割的工作单位。满足如下的四大特性:


  • 原子性(Atomicity):事务作为一个整体被执行 ,要么全部执行,要么全部不执行;

  • 一致性(Consistency):保证数据库状态从一个一致状态转变为另一个一致状态;

  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行;

  • 持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存


解析:


MySQL事务又是一个几乎必考的MySQL知识点,可以拓展的知识点较多,我们一起来接着看如下的考察点。



本文题目全部节选自《Java开发岗高频面试题全解析》


专刊适宜人群:

  • 备战校园招聘Java工程师岗位面试的在校生

  • 想巩固Java基础知识,并且提高自己的Java工程师

  • 有跳槽计划或者正在找工作的Java工程师


专刊亮点:

  • 分模块解析Java技术栈中常见的面试题,提高大家的学习与备战效率

  • 串点成面讲解技术原理,互动答疑解惑,交流职场经验

  • 代入感强,专刊作者半面试官半应聘者经历

  • 知名互联网大厂的社招,校招内推名额等


学完该专刊可以收获什么?

  • 你将收获Java技术栈的核心技术

  • 你将分模块收获Java岗位面试中高频的面试题及其解析,串点成面

  • 你将理解每一个高频面试题背后的考察点以及其实现原理,摒弃背题模式的陋习


专刊大纲:

本专刊讲解的核心是: 如何获取Java工程师岗位的Offer ?专刊讲解层层深入,主要从以下9个章节来进行解析总结:



专刊配套服务:

  • 读者交流群,任何对于专刊本身或者服务方面的建议都可以随时与牛客运营小姐姐进行沟通(购买后加七七老师微信即可进群)

  • 作者定期回复评论问题



原价49元的专刊

现在仅需29元即可购买

超多面试真题等你来学

优惠时间截止到2021.1.25零点


优惠暗号:mianshibihui

点击阅读原文立即29元购买专刊



点击阅读原文直接购买

▼▼▼

▼▼▼