与美团的面试经历,面试总时长为1小时40分钟。他表示,尽管技术题的回答比较顺利,但在智力题部分的表现欠佳,可能影响了校招的结果。因此,准备校招的小伙伴们不仅要重视技术问题,还要加大对智力题的练习力度。

这篇文章将分享面试中涉及的各类问题,主要分为计算机网络、Java基础、JVM、Redis和MySQL等领域,涵盖的知识点非常广泛,唯独操作系统相关问题较少。其中JVM部分问题尤其引人关注,这也与美团面试的偏好有关。

以下是面试问题的列表,随后将对部分问题进行详细分析。

计算机网络问题

  1. 为何需要进行三次握手和四次挥手?
  2. 如果客户端崩溃,后续处理流程是怎样的?
  3. TCP状态码中的4xx和5xx含义是什么?
  4. Session存储在哪里?请解释cookie和token的区别。

Java 基础问题

  1. hashCode和equals的关系:对象相等时,hashCode是否必定相等?
  2. final、finalize和finally的区别。
  3. BIO、AIO与NIO的主要区别。
  4. 为什么String是不可变的?
  5. Integer类型的默认范围是什么?
  6. 集合的遍历过程中能否进行删除操作?
  7. ArrayList中的数组为什么使用transient修饰?
  8. 线程池的退出过程是怎样的?
  9. 如果线程池的队列已满,处理将如何进行?
  10. 单例模式中的DCL(双检锁)介绍。
  11. synchronized、AQS和volatile的作用。
  12. CAS中的ABA问题是指什么?

JVM相关问题

  1. 服务类数量增加对整体启动性能的影响有哪些?
  2. 哪些区域不会导致OOM(内存溢出)?
  3. 内存的分配方式有哪些?
  4. 访问对象的方式有什么不同?
  5. 你使用过哪些垃圾回收器?
  6. 垃圾回收算法都有哪些?
  7. 老年代引用新生代的情况,除了GC Root还涉及哪些引用配置?
  8. 遇到以下几种情况时,你认为问题出在哪里?

面试问题示例

Redis问题

  1. 使用Redis的优点是什么?
  2. 什么是缓存穿透与缓存雪崩?

MySQL问题

  1. 请解释表索引的执行过程。
  2. 在什么情况下索引会失效?
  3. 哪些情况会使用到索引?
  4. 大于或等于的范围查询是否一定会导致索引失效?
  5. 请解释事务中的二阶段提交。
  6. 讨论change buffer的作用。

智力题

  1. 在8个球中,有7个重球,如何快速找到一个重球?
  2. 两次生女孩的概率是多少?

对于一些未提到或稍显复杂的问题,我在这里分享几点:

1. ArrayList中的数组为什么使用transient修饰?

transient修饰符表示该字段不序列化。对于ArrayList内部数组的transient标记,意味着数据不会被序列化,从而避免了在序列化过程中将空值也一并存储。为了有效序列化,ArrayList通过实现writeObject和readObject方法,确保仅序列化实际存在的元素。

ArrayList内部结构

2. 老年代引用新生代,除了GC Root还用什么?

在进行新生代GC时,如果老年代对象引用了新生代对象,传统的区域扫描方式效率低下。因此,引入记忆集(Remembered Set)来优化这一过程。记忆集通常用卡表实现,其目的不是精确定位引用,而是标记出某一区域对新生代的引用。

3. 如果出现以下情况,你认为出了什么问题?

GC问题分析

结合五个因素分析:当CPU处于空闲状态却频繁GC、年轻代稳定但老年代内存波动,这表明许多对象直接进入了老年代,并且这些对象生命周期短暂,造成了内存的不断波动,这种现象被称为“抖动”。

总结来说,这些问题并不复杂,关键在于你对相关知识的理解。比如,记忆集的概念可能不会直接问,而是通过相关场景引导你思考。掌握GC的流程和原理,比单纯记忆要有效得多。