快手Java日常实习一面面经
《面试题目》
- 自我介绍
- 为什么大一学Java、大二找实习?
- 自学Java与学校课程的区别?
- 手撕算法:链表题或两数之和(选两数之和)
- JVM概念及组成部分(运行时数据区及其他部分)
- JUC概念、JUC包组成及多线程实现方式
- 线程池:类型、参数、执行原理及参数设计策略
- 为什么IO密集型需要调大线程数?
- 实习中使用的线程池提交方法及线程安全定义
- 项目/实习中遇到的难点及解决思路
- Redis深度交流:单线程/多线程区别、工作模式、持久化机制(RDB/AOF适用场景)
- 离职原因及个人挑战思考
- 反问环节
《参考解析》
1. JVM组成: 除了运行时数据区(堆、栈、方法区、程序计数器等),还包括类加载子系统、执行引擎、本地方法接口和本地方法库。
2. 线程池参数设计: 核心参数包括corePoolSize、maxPoolSize、keepAliveTime、workQueue、threadFactory、handler。CPU密集型建议设置为CPU核心数+1;IO密集型建议设置为2*CPU核心数或根据IO等待时间比例动态计算。
3. 线程池执行原理: 优先核心线程处理;核心线程满则进入任务队列;队列满则创建非核心线程;非核心线程也满则执行拒绝策略。
4. Redis线程模型: Redis 6.0前是单线程(基于IO多路复用),6.0后引入多线程处理网络IO读写,但核心命令执行仍是单线程,保证了原子性。
5. RDB vs AOF: RDB是快照备份,恢复快,适合容灾恢复;AOF是命令追加,数据丢失风险小,适合对数据完整性要求高的场景。