本人在 2022 年 10 月份投递了字节跳动的实习,整体流程还是比较顺利的,在这里分享下面经
一面
主要考察基础
JAVA 基础:
JUC 里各种锁,自己有哪些使用场景。
主要聊了 AQS,以及基于此的可重入锁,读写锁,信号量等,使用场景结合项目聊
JVM 基础,创建了一个实例,会在哪些地方分配内存。
需要考虑类加载,会涉及到方法区、堆、虚拟机栈
GC Roots 有哪些,GC 如何标识可回收。
基础八股,GCRoots 除了方法区、常量池、栈等地,还会包括虚拟机自身的对象(不过这个不要求)
MYSQL
给了一个场景,如何用最高效的方式进行查询
考察 联合索引 + 最左前缀匹配,还扯了索引条件下推和索引覆盖的,不过没这个必要
InnoDB 引擎底层隔离实现
基础八股,MVCC 实现
框架
Spring 有哪些标在方法上的注解。如何实现的。如果让你自己创建代理怎么搞
注解就说了下 @Scheduling、@Async、@Transactional 这些。都是通过 AOP + 后置处理器实现的,可以自行参考 Spring 源码。创建代理说了 JDK、CGLib、JavaAssist
WebSocket 原理。有哪些全双工实现方式。
基础八股
Netty 的优势,IO 多路复用的操作系统级别实现。
说下 Netty 的优秀设计,后者就是聊下 select、poll、epoll 的实现原理
零拷贝大致概念。如何用的堆外内存优化。
零拷贝属于基础八股,堆外内存优化 JDK 本身就用的很多,主要用于减少数据拷贝
数据到达网卡后服务端如何读到。
操作系统流程,从网卡开始讲
分布式
我简历写了会分布式,所以才问了
Mysql、Redis、RabbitMQ 在集群模式下的区别。
简单聊下集群模型就 OK
Redis 如何跨城市复制
想让我聊容灾,但当时不会,直接跳过了
算法
给定一颗二叉树,以及一个值,输出中序遍历时该值的后继值
迭代找后继 或者 Dfs 找后继,挺简单的题
二面
依旧是考察基础
设计模式自己咋用的
就聊下有哪些设计模式,以及结合自己项目或者框架聊下使用,我大部分都是结合 Spring 聊
数据库事务、隔离级别
聊下数据库的隔离级别为啥要这么设计(并发现象),以及不同隔离级别的不同实现和不同特性
细说 Mysql 索引
聊下B+树的细节,细到页目录就可以,不用到行格式,主要是说下数据结构以及索引流程
GC 算法,咋用的,线上怎么用
GC 算法八股,聊了下 CMS、G1、ZGC 这些垃圾收集器,线上怎么用主要是考察 JVM 调优
TCP 和 UDP 的区别,分别有什么使用场景。输入 URL 后发生的事,具体到数据链路层。线程池参数都有啥用,原理呢
基础八股
手写一个阻塞队列
稍微看过 ArrayBlockingQueue 的源码就能写出来,挺简单的
三面
会考察下学习潜力
你说你经常读源码,都有读哪些呢?
我大二期间还是读了蛮多源码的,说了很多
能挑一个讲讲吗
挑了 Dubbo,聊了服务发现中心、SPI、负载均衡、代理、通信等
你有提到扩展性,你自己是怎么做的
我主要使用观察者模式 + SPI
你有提到自己在实现框架,目前进度怎么样
聊了我自己的 RPC 和 Raft 框架
对于并发编程你有什么自己的实现么
结合自己的项目聊,稍微有点新意比较好,例如我自己配合 @Transactional 的逻辑加上 CountDownLatch 弄了一个伪 XA 实现
两道简单代码题:
- 计算二叉树的高度,用非递归实现
层序遍历就行
- 一道基础的 SQL 题
差不多力扣中等难度
总体而言字节的面试体验还是挺舒服的,也并没有硬卡学历的情况(一本及以上就行)。
入职后和 Mentor 聊了下面试,说实习面试不会太关注项目,主要还是考察基础,因此大家如果准备充分了推荐考虑投递字节的实习,公司氛围、福利都不错,当然前提是一定要保证准备充足,字节的面评是会保留的,如果面试发挥得烂会影响后续的流程(会直接挂简历)。