设计原理
- uuid 是否有重复?
- 线程池
- 前 10 个 ip,内存不足
项目
- Storm/Flink 消息有序性保证
- 蓄洪机制原理
- storm-jms 模块修改
- ugc 视频生产优化
- 工作流引擎原理
- MySQL 分库分表原因
- 推荐机制
- Neo4j 原理,社区版和商业版,对比其他图数据库
Spring
- Hibernate 优缺点,Mybatis 优缺点,为什么都用 Mybatis?
- Spring 启动过程?
- Bean 加载过程
- AOP 原理(字节码层面)
- 循环依赖
- Spring Boot 自动注入配置原理过程
- 事务传播级别
- Spring Interceptor 机制,以及和 filter 区别关系?
RPC 框架
- 设计一个 RPC 框架
- RPC 框架通讯协议
- 常见 RPC 框架,优缺点,原理
网络
- 三次握手,四次挥手,包括状态变化
- 拥塞
- 滑动窗口
- MTU/MSS
- 可靠性如何保证
- HTTP(S)协议,HTTP1/2
Java
- HashMap 原理
- 多线程编程,CountLatch、CyclicBarrier
- Volatile/Synchronized
- 可重入锁、自旋锁、偏向锁、轻量级锁
- 多线程环境下单例的两种实现(effective java),以及 volatile 存在的意义
- 线程池原理
- 实现简单的线程池
- 多路复用 IO 为何比非阻塞 IO 的效率更高?
- 非阻塞 IO 中,不断地询问 socket 状态是通过用户线程进行的,在多路复用 IO 中,轮训每个 socket 状态是内核中进行的,效率要比用户线程要高
- Java IO/NIO
- 阻塞 IO
- 非阻塞 IO
- 多路复用 IO
- 信号驱动 IO
- 异步 IO
- 只需先发送一个请求,当接收内核返回的成功信号时表示 IO 操作已经完成,可以直接去使用数据
- Java NIO
- 三大核心:Channel, Buffer, Selector
- IO 是面向流的,NIO 是面向缓冲区的
- HashMap
- bucket
- 两倍扩容
- 负载因子为 0.75
- 数组+链表+红黑树(阈值是 8)
- ConcurrentHashMap
- Java7:Segment,并行级别默认是 16
- Java8:CAS, 红黑树
JVM
- 运行时数据区划分
- 垃圾回收
- 类加载过程
- 栈帧
- 内存溢出和内存泄漏的区别
- StackOverFlow 和 OutOfMemory 区别
- 对象从新生代移到老年代的条件
- Java8 中永久代被移出,由元空间取代,使用本地内存,字符串池和类的静态变量放入 java 堆中
- GC Roots 有哪些?
- VM 栈中的引用
- 方法区中的静态变量
- JNI 中的引用
- 垃圾收集算法
- 垃圾收集器
- Serial
- ParNew
- Parallel Scavenge
- 新生代,复制算法,多线程
- 可控制的吞吐量,CPU 运行用户代码的时间/CPU 总消耗时间
- 自适应调节策略
- Serial Old
- Serial 的老年代版本,单线程,标记整理算法
- CMS 的后备方案
- Parallel Old
- Parallel Scavenge 的年老代版本,多线程,标记整理算法
- CMS
- 多线程,标记清除算法
- 初始标记、并发标记、重新标记、并发清除
- G1
- 标记整理,无内存碎片,低停顿
- 区域划分、优先级区域回收
- 类加载器
- 双亲委派模型
- 当一个类加载器收到了类加载请求,会把这个请求委派给父类加载器,只有父类加载器反馈自己无法完成时,子类加载器才会尝试自己去加载。好处是保证了使用不同类加载器最终得到的都是同样一个对象。
- 双亲其实就是父亲
排序算法
- 快排
算法
图
- 路径查找
树
- 红黑树
Effective Java
分布式
- 分布式事务
- 分布式锁
数据库
- 聚簇索引和非聚簇索引
- 主键索引和联合索引