校招 未知部门 / 后端-Java / 多轮
[面试日期] 2026-09-21 [面试时长] 未知
[学校背景] 北京理工大学 | 985 [学历背景] 本科
[发布人] 面试之星官方收录
<h2>分享|3年Java面字节,一面六个方向深挖,三面终于OC</h2>
<p>先交代背景:普通本科,Java后端,3年经验,上一家是某二线互联网公司,负责过订单系统和营销系统的开发。</p><p>字节3年经验的面试,一面<strong>45分钟</strong>,围绕并发、JVM、Spring、MySQL、Redis、MQ六个方向深挖。面试官不追求“你答了多少题”,而是顺着一个点往下追,追到你答不上来为止。我面了字节三轮技术面加HR面,整个过程磕磕绊绊,最终OC。</p><p><strong>📌 第一阶段:一面六个方向深挖45分钟(7月)</strong></p><p><strong>方向一:并发编程</strong></p><p>面试官从ConcurrentHashMap切入,连续追问了三层。</p><p><strong>1️⃣ ConcurrentHashMap在JDK 7和JDK 8中的实现有什么区别?</strong></p><p>💡 <strong>思路参考</strong>:JDK 7使用分段锁(Segment),锁粒度是段级别,默认16个Segment,并发度最大16且不可扩容。JDK 8改为CAS + synchronized + 数组 + 链表 + 红黑树,锁粒度是桶级别,并发度等于数组长度,支持动态扩容。3年经验要能说出<strong>为什么要从分段锁改为桶级锁</strong>——分段锁的并发度受限于Segment数量,桶级锁的并发度可以随数组扩容而提升。</p><p><strong>2️⃣ 追问:“ConcurrentHashMap的size()方法是准确的吗?”</strong></p><p>💡 <strong>思路参考</strong>:不是绝对准确的。JDK 8的size()基于baseCount和CounterCell[]求和,是近似值。因为在统计过程中可能有其他线程在并发修改。3年经验要能说出<strong>为什么需要CounterCell</strong>——多个线程同时CAS更新baseCount会导致大量自旋失败,用CounterCell分散热点,类似LongAdder的思想。</p><p><strong>3️⃣ 追问:“那ThreadLocal在线程池场景下会有什么问题?”</strong></p><p>💡 <strong>思路参考</strong>:ThreadLocalMap的key是弱引用,value是强引用。线程池中线程长期存活,ThreadLocal变量被回收后,Entry变成key=null但value仍存活的无效条目,永远不会被清理,导致OOM。解决方案:finally块中手动调用remove()。3年经验要能说出<strong>为什么用弱引用而不是强引用</strong>——如果是强引用,ThreadLocal对象永远无法被回收,泄漏更严重。</p><p><strong>方向二:JVM</strong></p><p><strong>4️⃣ JVM线上Full GC频繁,你怎么排查?</strong></p><p>💡 <strong>思路参考</strong>:标准排查链路——jstat观察GC频率和老年代占用率→jmap dump导出堆内存→MAT分析Dominator Tree找大对象→定位代码→修复。3年经验要能说出<strong>dump文件分析的具体步骤</strong>和<strong>MAT的Leak Suspects报告怎么看</strong>。</p><p><strong>5️⃣ 追问:“GC耗时10毫秒,为什么系统却卡顿了10秒?”</strong></p><p>💡 <strong>思路参考</strong>:GC本身只停了10ms,但卡顿10秒说明问题不在GC停顿,而在<strong>GC后的连锁反应</strong>——GC后大量对象被回收,缓存全部失效,后续请求全部穿透到数据库;或者GC导致线程池中的任务积压,恢复后瞬间涌入压垮下游。3年经验要能说出<strong>完整的排障链路和止损策略</strong>。</p><p><strong>方向三:MySQL</strong></p><p><strong>6️⃣ MySQL的MVCC和间隙锁是怎么配合防止幻读的?</strong></p><p>💡 <strong>思路参考</strong>:可重复读隔离级别下,快照读(普通SELECT)用MVCC保证可重复读(基于Read View的可见性判断),当前读(SELECT FOR UPDATE / UPDATE / DELETE)用间隙锁防止其他事务插入新行。3年经验要能说出<strong>间隙锁的加锁规则</strong>——只有可重复读隔离级别下才有间隙锁,读已提交没有。</p><p><strong>方向四:Redis</strong></p><p><strong>7️⃣ Redis的缓存穿透、击穿、雪崩分别是什么,怎么解决?</strong></p><p>💡 <strong>思路参考</strong>:<strong>穿透</strong>——查询不存在的数据,缓存和DB都没有,请求全部打到DB。解决方案:布隆过滤器+缓存空值。<strong>击穿</strong>——热点Key过期瞬间,大量请求打到DB。解决方案:互斥锁(只让一个线程去加载)。<strong>雪崩</strong>——大量Key同时过期。解决方案:过期时间加随机值。</p><p><strong>方向五:Spring</strong></p><p><strong>8️⃣ Spring循环依赖的三级缓存是怎么解决的?</strong></p><p>💡 <strong>思路参考</strong>:一级缓存singletonObjects存完整Bean;二级缓存earlySingletonObjects存半成品Bean;三级缓存singletonFactories存ObjectFactory。核心逻辑——A实例化后暴露ObjectFactory到三级缓存→填充属性发现依赖B→创建B→B填充属性发现依赖A→从三级缓存拿到A的ObjectFactory生成早期引用→B完成创建→A完成创建。3年经验要能说出<strong>为什么要三级缓存而不是二级</strong>——三级缓存是为了处理AOP代理,保证注入的是代理对象而不是原始对象。</p><p><strong>方向六:MQ</strong></p><p><strong>9️⃣ 消息队列如何保证消息不丢失?</strong></p><p>💡 <strong>思路参考</strong>:三个环节——生产者确认(publisher confirm,确保消息到达Broker)、Broker持久化(消息写入磁盘,主从复制)、消费者手动ACK(消费成功后再确认)。3年经验要能说出<strong>每个环节的丢失风险和对应方案</strong>。</p><p><strong>📌 第二阶段:二面三面全过了(8月)</strong></p><p><strong>二面(50分钟)——过了</strong></p><p><strong>1️⃣ 系统设计:设计一个支持亿级流量的电商大促系统</strong></p><p>💡 <strong>思路参考</strong>:流量削峰——CDN加速静态资源、Nginx限流(漏桶算法)、MQ削峰填谷(将请求先写入消息队列,消费者按能力处理)、Redis预扣库存(Lua脚本原子性)、分布式事务(TCC)。3年经验要能说出<strong>每层的瓶颈和扩容方案</strong>——Redis单节点QPS 10万+,集群分片可扩展到百万级。</p><p><strong>2️⃣ 分布式事务选型:TCC vs SAGA vs 消息最终一致性</strong></p><p>💡 <strong>思路参考</strong>:TCC适合核心资金链路(强一致性但侵入性大),SAGA适合长事务(补偿回滚),消息最终一致性适合非核心异步场景。3年经验要能说出<strong>空回滚和悬挂问题的具体解决方案</strong>。</p><p><strong>三面(交叉面,40分钟)——过了</strong></p><p><strong>1️⃣ 系统设计:设计一个全链路压测平台</strong></p><p>💡 <strong>思路参考</strong>:全链路压测的核心是<strong>流量染色</strong>——压测流量打上特殊标记,在链路中透传,确保压测流量只走影子库/影子表,不污染生产数据。关键设计:数据隔离(压测数据写入影子库)、流量隔离(压测流量只路由到压测分组)、监控隔离(压测指标单独统计)。</p><p><strong>HR面(20分钟)——OC</strong></p><p><strong>📌 声明</strong></p><blockquote><p><em>以上思路参考来自 </em><strong><code><em>"面题鸭🦆"</em></code></strong><em> 各岗位专属考题的考点方向</em></p></blockquote><p><strong>📝 复盘</strong></p><p>字节3年经验的面试,考的是三件事:</p><ol><li>能不能讲清楚底层机制(ConcurrentHashMap分段锁演进、ThreadLocal泄漏、MVCC+间隙锁)</li><li>线上出事了能不能扛住(GC连锁反应、缓存三大问题)</li><li>能不能做系统设计(亿级流量、全链路压测、分布式事务选型)</li></ol><p><strong>🎯 后来怎么调整的?</strong></p><p>一面挂的原因是JVM线上排查的思路不够系统,只会背参数不会结合实际场景分析。</p><p>还有一个意外收获——没想到在 <strong><code>"面题鸭🦆"</code></strong> 上刷了一遍字节方向的JD专属出题和大厂考题,ConcurrentHashMap分段锁演进、ThreadLocal泄漏、GC连锁反应这些方向覆盖得很全。二刷时心里有底很多。</p><p></p><a>#大厂#</a><a>#java#</a><a>#发面经攒人品#</a><a>#找不到好工作选择GAP真的丢人吗#</a>
AI 推荐面试题
