简历项目
好的,我们开始面试。以下是针对你的简历提出的技术问题,请做好准备:
# 一、Java核心
- 你提到熟悉JUC,请解释AQS的工作原理,并举例说明ReentrantLock如何基于AQS实现可重入性?
- 使用ThreadLocal存储用户信息时,如何避免内存泄漏?ThreadLocal的key为什么设计为弱引用?
- 线程池的核心参数有哪些?如果任务队列使用无界队列会导致什么问题?如何合理配置线程池参数?
# 二、JVM
- 你熟悉JVM内存结构,请画出JVM运行时数据区结构图,并解释方法区与元空间的关系。
- 如果线上服务发生Full GC频繁,你会如何排查?请描述具体步骤和可能用到的工具。
- CMS收集器与G1收集器在内存回收策略上有何本质区别?为什么G1更适合大内存服务?
# 三、Redis(重点考察)
- 缓存穿透解决方案中,你提到缓存空数据。假设恶意攻击者构造大量不存在的key,如何防止Redis被无效key占满?
- 在秒杀场景下使用Lua脚本有什么优势?如果Redis执行Lua脚本时发生网络分区,CAP如何取舍?
- Redisson分布式锁的"看门狗"机制如何实现锁续期?如果客户端宕机,锁会立即释放吗?
# 四、MySQL
- 你提到使用乐观锁控制库存,在超高并发场景下可能出现什么问题?如何通过悲观锁+存储过程优化?
- 如果发现索引失效,你会如何排查?请举例说明最左前缀原则和索引下推的区别。
- 解释redo log和binlog的二阶段提交过程,为什么说这是"双1"配置的理论基础?
# 五、消息队列
- 使用RabbitMQ实现订单超时处理时,为什么选择死信队列而不是延迟队列?两种方案各有什么优缺点?
- 如何保证消息队列的消费幂等性?如果消息被重复消费了3次,系统会出现什么问题?
# 六、项目深挖
- 在校园美食圈项目中,你提到接口响应时间降低30%。请说明压测的具体指标(QPS、响应时间、错误率)和压测工具。TPS提升多少才算真正有效优化?
- 使用WebSocket实现来单提醒时,如何保证消息的可靠传输?如果遇到网络抖动导致连接中断,系统如何恢复?
- 在分布式锁实现一人一单时,如果获取锁后发生长时间GC导致锁超时释放,此时其他线程获得锁并完成下单,此时第一个线程恢复后继续操作,会出现什么问题?如何解决?
# 七、系统设计
- 如果要为校园美食圈增加"附近商家"功能,支持3km内的商户推荐,你会如何设计空间索引?使用Redis GEO还是MySQL GIS?
- 假设秒杀活动期间Redis集群出现主从切换,此时库存数据可能出现不一致,如何设计兜底方案?
# 八、进阶问题
- 在Zookeeper和Redis两种分布式锁方案中,如果要实现一个金融级分布式锁,你会如何选择?为什么?
上次更新: 2025/6/10 17:21:17