20年底准备的一点复习经验,面过了美团、字节等几个大厂
主要是自己在面试过程中整理的一些问题,以及自己被问到的关键点。
效果还是不错的,美团、字节、boss直聘、完美世界、滴滴、度小满、58、爱奇艺都通过了。
基础部分
专业基础
- 计算机通信的四元组
- tcp和udp是哪层的?啥区别?二者特点?
- TCP协议
- 握手挥手。一般问缺失某次握手会有什么结果,网络异常会如何等
- keepalive方式和超时概念
- 突发大量time-waiting/close-waiting/xxxx的tcp链接,判断原因,后续处理方式
- 拥塞控制
- CPU调度、死锁概念、银行家算法等
- HTTP协议,主要看下1.1版本即可
JVM
- 堆内存划分以及堆外内存
- 直接内存的概念
- 对象头
- 线程共享与线程独占
- 内存回收算法
- CMS和G1的特点与过程,尽量详细,其他的基本很少问
- 常用jdk工具,jmap、jstack、jps、jstat等的简单概念,知道这四个哪个是干啥的就行
多线程
- 线程池的运行模型,以及参数意义和线程数的设定思路
- 多线程间数据共享(拓展:进程间数据共享)
- 多线程调度方式:Object类的、Thread类的以及JUC包的都需要了解
- ThreadLocal和Inheritablethreadlocal
- 生产-消费者模型
- 异步/响应式优化设计,Future和CompletableFuture等
- 阻塞队列
- 线程安全的概念,HashTable到ConcurrentHashMap的变化,并自行设计一个简单的线程安全的集合类
锁
- Sycronized锁升级机制
- 偏向锁的概念
- Lock接口
- ReentrenLock的重入原理
- ReadWriteLock简单了解(这玩意本来也没啥意思)
- 设计一把锁(考的是你对锁的理解,要明白锁的几个必须元素,以及风险规避)
集合、Stream、Iterator等
- Java8的Stream工作模式简单了解一下
- Iterator、foreach(A a : Collection aaa)、aaa.foreach()、for(a,b,c)的区别
- ArrayList、LinkedList这些结构了解一下,知道集合中哪些线程安全哪些不安全,为啥不安全,就可以了
- 为什么缓存一般建议在初始化完毕,使用之前,转换成不可变集合?
IO模型
- BIO
- NIO
- AIO
- Linux环境
- select
- poll
- epoll
框架、DB与分布式
Spring
- Spring的Bean加载机制与Java的类加载机制(双亲委派)
- Spring容器提供DI和AOP的原理
- @Repository和其他@Component、@Service等的区别
- @Configuration和@Order用法与场景
- @Controller和@RestController区别
MySQL
- B+树的特点。B+比B多了什么?为什么用B+不用红黑?
- 复合索引的最左优先原则
- 聚簇索引与非聚簇索引
- 查询时的回表问题如何优化?索引覆盖是什么?
- 索引合并
- MySql对查询语句会有哪些优化?
- 索引设置在频繁更新的列上会有哪些问题?
- 页的概念
- binlog、redolog、undolog
- 主从延迟的处理思路和优化方案
分布式环境
Redis
- redis高性能的原因
- 几种基本数据结构,str、set、zset、list、hash
- 基本数据类型的特殊用法,bitmap、队列、布隆过滤器、hyperloglog等
- 持久化方式,全量和增量
- 集群场景数据读写的节点划分方式
- 常见问题:热key、大value、keys*等的处理方式以及出现问题的原因
- 缓存穿透、击穿、雪崩的概念
- redis事务、lua脚本、管道通信
消息队列
- Kafka高效原因
- mq如何保证“最多消费一次”、“至少消费一次”、“一定只消费一次”
- kafka partition
- mq的pull push模型
微服务
- CAP模型、AP和CP
- 分布式锁设计
- 熔断降级的实现思路(线程池、信号量)
- RPC的分层设计,可以基于几种rpc框架来说,比如feign、dubbo、grpc、thrift等
- 服务间数据互通的几种方式,越多越好
- 常见的长链接与短链接
- 分布式事务的几种解决方案
系统设计
秒杀系统
- 高并发变低并发
- 短高峰变长低峰
- 多节点处理
- 避免单点高压
- 避免超卖和未卖完却先拒绝订单的情况
业务复杂的高并发场景
- 数据库冷热字段拆表
- 根据合理的键拆库
- 数据缓冲层设计
- 消息队列分区(partition)消费设计
- 请求压力均摊
- 特殊数据库或引擎介入(时间数据库、流式计算引擎等)
海量数据场景
- 合理的数据拆分
- 灵活利用不同类型数据库的优势
- 冷数据定期归档
- 大数据介入(Hive等)
- 灵活的缓存设计(不要缓存最终内容,而是缓存中间计算结果)