CVTE,应用软件开发
- 时间
- 2026-08
- 来源
- 牛客网
《面试题目》
- 继续发一下之前整理的面经
- HashMap扩容的时候,如果两个线程同时触发resize,会发生什么问题?你说的这个链表成环的场景,具体是怎么产生的,画一下。
- ConcurrentHashMap在JDK8里为什么放弃了分段锁,改用CAS+synchronized,这样设计的好处是什么?
- 讲一下JVM里对象的内存布局,对象头里具体存了什么东西,为什么synchronized锁状态信息能存在对象头里?
- CMS垃圾回收器为什么会有”浮动垃圾”这个问题,G1是怎么规避这个问题的?
- 你说项目里遇到过一次线上OOM,能不能详细讲一下当时dump下来的堆内存快照里看到了什么,最后定位到是哪里的问题?
- 双亲委派模型如果被打破会有什么后果,你知道哪些场景是主动打破这个模型的(比如Tomcat的类加载器设计)?
- AQS里的state变量在ReentrantLock和CountDownLatch里分别代表什么含义,这个设计思路你怎么理解?
- synchronized锁升级到重量级锁之后,还能降级回轻量级锁吗,为什么?
- Spring解决循环依赖用的三级缓存,你能讲清楚每一级缓存分别存的是什么、为什么必须要三级而不是两级吗?
- @Transactional在什么情况下会失效,你在项目里有没有真的踩过这个坑?
- MySQL的B+树索引,如果我在一个字段上建了索引,为什么执行的时候优化器可能选择不走索引,全表扫描反而更快?
- 讲一下MVCC里的ReadView是怎么工作的,可重复读隔离级别下为什么还是有可能出现幻读,用了什么机制去解决?
- 你项目里说做过一次慢SQL优化,具体是怎么通过explain定位问题的,最后加索引还是改写SQL解决的?
- 你简历上写了一个基于大模型做智能客服/文档问答的项目,这个里面用到RAG的话,你是怎么处理检索出来的文档和用户问题相关性不高的情况的?
- 你在这个AI相关项目里有没有涉及到调用大模型API的成本控制,比如上下文长度太长导致token消耗过大,你是怎么处理的?
- 既然你项目里用到了向量数据库做检索,能讲讲你用的是什么方案,为什么选它而不是直接上ES做关键词检索?
- 消息队列这块,你说用RabbitMQ做异步解耦,如果消费者处理失败了,你是怎么保证消息不丢的,重试机制是怎么设计的?
《参考解析》
- Redis常用于缓存、分布式锁和计数。缓存与数据库更新通常采用“先写数据库、再删除缓存”,并通过重试、延时双删或消息补偿处理删除失败。
- MySQL索引通常使用B+树,叶子节点按顺序连接,适合范围查询;设计索引时结合选择性、最左匹配原则和执行计划,避免无效索引与回表开销。
- 并发问题应先明确共享状态和一致性边界,再选择锁、CAS或队列。线程池需要根据任务是CPU密集还是IO密集设置核心线程数、队列容量和拒绝策略,并监控活跃数与队列长度。