快手后端一面面经
面试题目
项目拷打:
- Agent项目与传统后端项目的架构差异。
八股文:
- Redis集群部署中Key如何定位到节点?
- Redis单副本/双副本节点宕机后的访问情况。
- HashMap底层结构、扩容机制、节点遍历顺序及排序规则。
- 如何计算桶位?自定义对象作为Key时的情况。
- 创建线程的方式,线程间同步的方法。
- 加锁的方式有哪些?
- synchronized临界区抛出OOM或异常,锁会自动释放吗?
- OOM是什么?可以捕获处理吗?能否防止程序退出?
- Java进程的退出条件是什么?
- 方法内创建线程,方法返回时线程是否会随之退出?
- 虚拟线程与操作系统线程的对应关系。
- 线程崩溃是否会导致整个进程退出?异常如何处理?
- 操作系统任务调度流程及上下文切换内容。
- 为什么使用虚拟内存?
手撕代码:
- 判断B树是否为A树的子树。
参考解析
- Redis定位:通过CRC16算法计算Key的槽位(Slot),集群共16384个槽,由不同节点分片存储。
- HashMap遍历:HashMap本身是无序的。若使用LinkedHashMap则维护插入顺序,TreeMap则按Key的自然顺序或Comparator排序。
- 锁与异常:synchronized在代码块执行结束(无论正常还是抛出异常)时,JVM会自动释放锁。OOM(OutOfMemoryError)是Error,属于JVM无法恢复的严重问题,虽然可捕获,但不建议且通常难以处理。
- 进程退出:Java进程通常在所有非守护线程(User Thread)运行结束时退出。若存在正在运行的子线程,主线程方法返回不会导致进程退出。
- 上下文切换:包括寄存器状态(PC指针、堆栈指针)、虚拟内存页表信息、内核栈及程序执行现场的保存与恢复。