字节跳动后端暑期实习一面面经
面试题目
- 解释一下 JMM。
- 介绍一下 volatile 的作用,它是怎么保证可见性和防止指令重排的?
- 介绍一下 Java 的 GC 机制。
- Redis 为什么那么快?
- Redis 7.0 后加入了多线程,具体针对哪一方面的?
- Redis 持久化机制有几种?RDB 会丢数据吗?
- 项目拷打:从数据库表结构开始,重点询问高并发项目相关设计。
- 算法题:用栈实现队列。
参考解析
- JMM: Java内存模型定义了共享内存中多线程读写操作的行为,通过主内存和工作内存的交互,解决并发编程中的原子性、可见性和有序性问题。
- volatile: 保证可见性(强制刷新主存)和有序性(禁止指令重排)。底层通过内存屏障(Memory Barrier)实现,禁止特定类型的处理器重排序。
- GC机制: 主要包括判断对象存活(可达性分析)、GC算法(标记-清除、复制、标记-整理)以及分代收集理论(新生代/老年代)。
- Redis快的原因: 纯内存操作;基于非阻塞I/O多路复用模型;单线程避免了上下文切换和锁竞争开销;高效的数据结构(如跳表、压缩列表)。
- Redis多线程: Redis 7.0 引入多线程主要用于处理网络请求读写(IO线程),即把网络连接的数据解析任务分担给子线程,核心命令执行依然保持单线程以保证原子性。
- 持久化机制: RDB(快照)和 AOF(日志)。RDB由于是定时快照,在两次快照间隔期间发生宕机会导致数据丢失;AOF通常配置每秒同步,数据可靠性更高。