过去几个月里面的几家大厂,均拿到 offer,最终去了字节跳动。总体感受:
- 每个大厂问项目问得特别细,虽然下面的面经都只用了一句话去概括,但在实际面试过程当中,项目这一块占了整个面试流程的很大一部分,相反纯技术问题的占比都比较小。
- 面试题几乎类似,比较简单,也很常见。(文末有参考解析)
美团
通常是两轮技术面试,一轮 HR 面试,第一面会有一道算法题,有的时候会有三轮技术面试。
一面
- 一道算法题,十分钟左右时间,要求能正常运行,通过给出的测试用例。
- 最近做过的最有挑战的项目,有哪些难点?
- 结合项目细聊系统的设计,根据你的设计提出疑问。
- 你们项目中是如何保证数据一致性的?
- 代码在执行 SQL 语句时,数据库连接出现了超时异常,但是你不知道这条 SQL 语句在数据库中究竟有没有执行成功,这种情况怎么保证数据的一致性?
- 你们系统中分布式锁是如何实现的?(当时回答采用 redis 实现,set(key,value,nx,ex,expire))
- 上面使用 redis 实现分布式锁会存在什么问题?
- 项目中除了使用 redis 实现分布式锁,还有哪些使用场景?
- redis 的数据持久化机制?如何保证数据不丢失?当 redis 内存满了以后,内存的淘汰策略?
- AQS 实现锁的原理?与 synchronize 的区别
- MySQL 存储引擎的区别?数据库有哪些隔离级别?
- MySQL 索引的数据结构是什么?为什么选择这种数据结构?
- B+Tree 和 B-Tree 有什么区别?
- Reactor 线程模型有哪些?Netty 是如何支持这三种线程模型的?
- 多路复用器的实现原理?
- epoll 的实现原理?epoll、poll、select 的区别
- JVM 如何进行垃圾回收?标记算法有哪些?垃圾回收算法有哪些?
- CMS 垃圾回收器的原理?
二面
- 最近做过的最有挑战的项目?
- redis 和 MySQL 的双写一致性问题?你们是如何做的?为什么这样做?其他的做法会存在什么问题?
- 分布式锁的实现原理
- 数据库有哪些隔离级别?这几种隔离级别分别解决了什么问题?
- MySQL 是如何解决不可重复读问题的?
- MVCC 的实现原理
- MySQL 的可重复读隔离级别下,存在幻读吗?为什么?
- 数据库的索引是不是创建得越多越好?为什么?通常创建几个?
- 一张表中对 a、b、c 三个字段分别建立了索引,现在有一条 SQL 语句:select field1,field2 ... from t where a = xx and b=xx and c=xx. 请问这条 SQL 语句会使用到索引吗?如果会,那么会使用到哪个索引?(回答:只会使用其中一个索引,可能是 a,也可能是 b,还有可能是 c,具体使用哪个索引和表中的数据有关)
- 为什么不会同时使用 a,b,c 三个索引?什么是回表?
- 聚簇索引和非聚簇索引的区别
- 如何知道一条 SQL 语句使用了哪些索引?(回答:使用 explain 查看)
- explain 的结果有哪些列?分别代表什么含义?
- 如何查看慢 SQL?
- 在 Spring 事务中执行多条 SQL 语句时,是对应多个数据库连接还是一个数据库连接?(回答:一个连接,多个就无法保证事务了)
- 既然是一个连接,Spring 在前后执行多条 SQL 时,是如何保证当前线程获取到同一个连接的?(回答:当时没想到 ThreadLocal,面试官引导说,如果是你,会怎么实现。后来回答说存在一个 map,key 是当前线程,value 就是数据库连接,最后灵光一现,想到了 ThreadLocal)
- ThreadLocal 的实现原理?
- 使用 ThreadLocal 需要注意哪些问题?(实际上是问 ThreadLocal 内存泄漏的问题)
- Redis 主从复制的原理
- MQ 使用过哪些?如何选型?
- 使用的是什么 RPC 框架?为什么选择它?
- 线上服务流量猛涨,该如何操作,说下详细过程?新加服务节点也可能会导致服务还没起来,机器就被打爆了,这个时候怎么办?
- 一个场景题:现在有 1000 万的商家,知道他们的地理位置,当我们进入到 APP 首页时,如何加载出附近的商家?
- 职业规划?为什么选择在年底前跳槽?
字节
三轮技术面试,一轮 HR 面试,每轮技术面试都会至少有一道算法题。
一面
- 一道算法题
- 聊项目,你们的广告检索引擎是如何设计的?为什么你们的广告检索不使用 ElasticSearch 这样的搜索组件?
- Java 中的锁有哪些?和 Lock 的区别
- synchronized 的底层实现原理?
- AQS 的实现原理?
- volatile 的作用和实现原理?
- JVM 的垃圾回收算法
- GC Roots 有哪些?
- 简述新生代与老年代的区别?
- 类的加载过程?什么是双亲委派机制?
- 线程池的实现原理?线程池满了,再提交任务时会怎么处理?
- redis 实现分布式锁的原理?redis 的分布式锁有什么问题?lua 脚本熟悉吗?
- redis 中 key 的过期策略是什么?
- redis 的持久化机制?AOF 和 RDB 的区别?
- 什么是缓存击穿、缓存穿透、缓存雪崩?如何处理?
- MySQL 数据库索引的实现原理?
- 什么是回表?什么是联合索引?什么是最左前缀匹配原则?
- MySQL 如何保证高可用?主从复制原理?
- Explain 关键字的使用。
- RocketMQ 的实现原理。
- 注册中心的选型?
- Zookeeper 作为注册中心的实现原理?
- Zookeeper 实现分布式锁的原理?
二面
- 一道算法题
- 详细聊项目经历
- redis 缓存和数据库数据一致性怎么解决?
- 分布式系统中,分布式事务怎么解决?(回答:RocketMQ 的事务消息)
- RocketMQ 事务消息的实现原理?你们的项目中是如何通过 RocketMQ 来保证数据一致性
- MySQL 为什么使用 B+树来作索引,对比 B 树它的优点和缺点是什么?
- 什么是覆盖索引?
- MySQL 中事务的隔离级别?
- SQL 的优化经验?
- redis 持久化的机制?如何保证数据不丢失?
- redis 的内存淘汰策略?key 的过期策略?
- RocketMQ 如何保证数据的可靠传输(数据不丢失)?
- RocketMQ 中现在堆积了大量消息,该怎么处理?
- Netty 的线程模型?主从多线程模型下,线程是如何分工的?
- 线程池的实现原理是什么?如何设置线程池的参数?
- 对于 CPU 密集型的系统,为什么线程个数设置为 CPU 核数+1?为什么要+1?
- 对于 IO 密集型的系统,为什么线程个数为 2 倍 CPU 核数?为什么是 2 倍,而不是 3 倍、4 倍等等?
- RPC 框架的选型?
- Motan 是如何实现负载均衡的?
- 下一步的工作计划?为什么?
三面
- 一道算法题
- 图这种数据结构了解吗?如何判断图中是否有环?
- 如何找出图中所有的环境?
- Http 和 Https 的区别?
- TCP 三次握手和四次挥手?
- TCP 如何保证可靠传输?
- BIO、NIO、AIO 的区别?
- 加密算法知道哪些?什么是对称加密?什么是非对称加密?
- 如何保证接口的安全性?应该使用什么加密策略?
- 说下哈希一致性算法?
- MySQL 索引的数据结构和原理?
- MySQL 的调优经验
- 微服务的技术选型?为什么选择 Motan?
- RPC 调用的原理
腾讯
通常是三轮技术面试,一轮 HR 面试,第一轮面试会有一道算法题,有的时候可能是 4 轮技术面试。
一面
一面主要是问 Java 基础,常规题,比较见答案。
- Java 中使用的是值传递还是引用传递?
- 方法调用时入参是如何传递的?
- JVM 中有哪些数据区域?
- List 集合哪些?ArrayList 和 LinkedList 的区别和使用场景?为什么?
- HashMap 的实现原理?1.7 和 1.8 的区别?
- HashMap 中的 hash 算法?这样的 hash 算法有什么好处(高低 16 位均参与运算)?如何寻址?
- 使用 HashMap 会有哪些问题?(1.7 和 1.8 中有什么不同)如何解决?
- Java 中有哪些线程安全的 Map?
- ConcurrentHashMap 的实现原理?1.7 和 1.8 的区别?
- ConcurrentHashMap 如何统计元素的个数?会有什么问题?
- 什么是 JMM 内存模型?
- synchronized 的实现原理
- 线程池的实现原理?有哪些参数,分别是什么含义?
- 垃圾回收算法。
- Java 中反射的基本原理?实际项目中是如何使用反射的?
- 熟悉哪些设计模式?在项目中哪些地方实际使用过?
- 一道算法题
二面
主要聊的是项目,技术问题都是在聊项目的时候带出来的。
- 最近做过的最有成就感的项目?这个项目中遇到过什么问题?
- 你们的分布式系统中如何保证数据一致性问题?(回答:利用了 RocketMQ 的事务消息来保证最终一致性,后面大部分时间都在聊 RocketMQ 的实现原理)
- 客户端请求过来,后端如何防止重复请求,保证幂等?
- 如何实现分布式锁?
- redis 实现分布式锁存在什么问题?
- redis 分布式锁与 lua 脚本?
- redission 了解过吗?说说它的实现原理?
- 在项目中为什么使用 RocketMQ?对于 MQ,你们是如何选型的?
- RocketMQ 的实现原理?消息是如何存储的?
- 线上出现 MQ 丢失消息?问题可能出现在哪儿?如何保证 MQ 的消息不丢失?
- 如何保证 RocketMQ 的高可用性?
- RocketMQ 的事务消息的实现原理?
- 如何保证消息的顺序性?
- 如何保证消息不被重复消费?
- 你们项目中涉及到了转账相关的业务,那怎么保证资金的准确性和安全性?
- 针对你们的项目设计一个对账系统。
- 如何保证分布式系统的强一致性?
三面
和二面几乎一样,大部分时间聊项目,问题也类似,重复面试题不再赘述
- 聊项目经验
- 使用 redis 过程中遇到过什么问题?如何解决热 key 问题?
- 你们的 redis 使用的那种模式?集群模式和哨兵模式的区别?集群模式和哨兵模式如何保证 redis 集群的高可用?redis 集群的故障转移过程?
- raft 协议的原理?
- JVM 调优经验?
- 什么是三色标记?
- 数据库与缓存的双写一致性问题?
- 结合项目,分库分表该如何设计
- MySQL 的主从复制原理?
- ConcurrentHashMap 的实现原理?
- CucurrentHashMap 中 Node 节点是如何设计的?为什么要用 final 和 volatile 修饰 Node 节点的属性?有什么作用?
- 对个人职业有什么规划?
四面
- 项目经历
- 一个对象是如何存储在 JVM 中的?
- 类加载过程,以及方法的执行的过程?
- JVM 的垃圾回收机制?为什么要区分新生代、老年代?
- 线上 GC 有问题,如何排查?
- Spring 的 AOP 的使用场景?AOP 机制有什么好处?
- 分布式事务问题,CAP 理论?2PC、XA、TCC、MQ 等原理
- 类似于淘宝这样的系统,你觉得他们的他们是如何实现数据的强一致性的?
- redis 集群如何实现扩容?
- redis 的 rehash 的过程?
- Netty 的线程模型有哪些?
- 什么是 TCP 的面包与半包?Netty 是如何解决的?
- epoll 的原理?
- TCP 的三次握手和四次挥手?为什么是 3 次和 4 次?
- 你们的广告检索引擎是如何设计的?目前流量多大?如果支撑更大量级的广告投放
- 为什么从上一家公司离职?
阿里
三轮技术面试,一轮 HR 面试,第一轮通常是电话面试,第二轮是视频,可能会有一道算法题。
一面
一面基本是 Java 基础问题,比较简单。
- Java 如何判断一个对象能否被回收?垃圾回收算法有哪些?
- 什么是内存模型?
- 什么是线程安全?
- Java 中锁有哪些?synchronize 和 Lock 的区别?
- synchronize 的底层实现原理
- 对象在内存中的布局?
- volatile 关键字的实现原理?
- 什么是原子性、可见性、有序性?什么是 happen-before 原则?解释一下 final 的语义?
- 什么是 CAS?CAS 存在什么问题?
- Lock 系列锁的实现原理?
- 什么是原子类?原子类的实现原理?
- Java 中对象的引用有哪些类型?
- ThreadLocal 的实现原理?存在什么问题?如何避免?
- HashMap 的实现原理?1.7 和 1.8 的区别?
- 有哪些线程安全的 Map?ConcurrentHashMap 的实现原理?1.7 和 1.8 的区别?
- ConcurrentHashMap 是如何统计 size 的?
- MySQL 的索引为什么是 B+Tree,而不是数组、Hash 之类的数据结构?为什么不是 B-Tree?
- Redis 有哪些数据类型?List 中数据非常多怎么办?
- Redis 的持久化机制?AOF 和 RDB 的优缺点?
- 线上服务接口非常慢?如何排查?
二面和三面
二面和三面是同一天面的,记不清了,大概是这些问题,面试官比较喜欢追问。
- 一道算法题。
- 聊项目经历,非常细。
- 垃圾标记算法和垃圾回收算法有哪些?
- 什么是三色标记?什么是安全点与安全区域?
- 简述一下 G1 垃圾回收器的原理?
- 为什么你们项目中没有使用 G1 垃圾回收器?
- 什么时候会触发 Minor GC?什么时候出发 Old GC?什么是 Full GC?
- 对象什么时候进入到老年代?什么是动态年龄判断?
- 你们线上服务的 QPS 有多大?机器配置是多少?JVM 的参数是怎么设置的?GC 的频率?为什么要这这样配置?
- 假设线上服务的流量是当前流量的 1 万倍?系统会出现什么现象?如何优化?
- Redis 的高可用怎么保证?线上有多少台机器?怎么部署的?
- Redis 实现分布式锁的原理?存在什么问题?
- 如何用 Zookeeper 实现分布式锁?存在什么问题?
- Redis 中遇到热 key 会造成什么问题?如何发现热 key?如何解决热 key 的问题?
- SQL 的优化经验有哪些?索引的设计准则?
- 如何查看 SQL 的慢查询日志?线上服务出现慢查询了怎么处理?
- 线上数据库出现了死锁怎么办?
- MySQL 的 InnoDB 在可重复读隔离界别下如何解决不可重复读问题和幻读问题的?什么是快照读?什么是当前读?
- MySQL 中有哪些锁?什么是间隙锁?
- MySQL 中有哪些日志?
- 数据库有哪些特性?MySQL 是如何保证机器宕机重启后,数据不丢失的?
- binlog 有什么作用?将其格式设置为 statement 会有什么问题?你们线上是如何配置的?
- 如何保证 MySQL 的高可用?主从复制的原理?
- 现在线上环境中发现 MySQL 的总节点大幅落后于 master 节点,可能是什么原因?如何处理?
- 消息队列的选型?RocketMQ 的实现原理?
- 如何保证消息不丢失?如何保证不重复消费消息?
- 线上 MQ 出现消息大量积压,应该如何处理?
- 让你设计一个 MQ,你会如何设计?
- 什么是 mmap?
- netty 用过吗?为什么 netty 是高性能的网络框架?
- 零拷贝机制的实现原理?
- Zookeeper 集群如何部署?Zookeeper 如何实现选举?什么是 ZAB 协议?
- Zookeeper 如何保证数据的顺序一致性?
- Zookeeper 的使用场景?如何支撑大量的读请求?
- 你们微服务的注册中心是如何选型的?Zookeeper 和 Eureka 作为注册中心的区别?它们有什么瓶颈?
- 如何设计一款能支撑数十万机器组成的集群的注册中心?
- 如何设计一个秒杀系统?在双十一当天,从浏览器中输入 www.taobao.com 到加载出页面,说一下它的完整过程。
面经参考解析
以上所有问题的答案都有相应的解析文档参考,网上也有一些类似的面试题总结的文章,但小编这份绝对是数一数二,剩下你了去网上一个个找的时间!每个知识点都有左侧导航书签页,看的时候十分方便,由于内容较多,这里就截取一部分图吧。需要的读者朋友们可以帮忙转发支持一下然后点击传送门 即可!!
Java基础
Java 集合框架
jvm
多线程
网络
算法和数据结构
Spring
Netty
微服务/分布式
消息队列
分布式 ID,其他(网关、限流...)
MySQL
Redis
经验总结
这是我在工作、面试中学习并总结到的一些知识点,都是一些比较典型的、面试常被问到的问题。如果你平时没有注意去总结的话,那么当你面试被问到的时候可能会是一脸懵圈,就算这个问题你知道怎么回事,但是你平时没有认真总结,你也可能会出现逻辑混乱的情况,从而错失工作机会。
有些知识点不经常使用就会忘记,但是面试还会问,对此,我也是深受其害,所以我决定将这些遇见的问题整理下来,分享出去,帮助更多的人,我们共同进步。所谓“温故而知新”,没事的时候多翻看一下这些知识,没准就会有新的收获。你没时间整理的东西,我都帮你写好了。有需要的小伙伴点击传送门即可!!