一、Java底层原理深度拷问(含高频陷阱题)
1. ConcurrentHashMap在JDK17中的锁升级机制
- 锁粒度变化:JDK8使用Node+CAS,但在高并发写入场景下会退化为synchronized锁。
- 扩容黑科技:多线程协助扩容时,如何通过ForwardingNode实现无感知迁移?需结合内存屏障原理分析。
- 致命陷阱:为什么ConcurrentHashMap的size()方法返回值不精确?如何用LongAdder优化?
2. JVM调优实战:秒杀场景下的GC参数设计
-XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:InitiatingHeapOccupancyPercent=35
- G1停顿预测模型:如何通过
-XX:G1ReservePercent防止Evacuation Failure? - 元空间泄漏定位:MAT工具分析ClassLoader引用链的3种技巧。
3. 线程池的死亡螺旋难题
- 场景:核心线程数10,队列容量100,最大线程数20,当第131个任务到达时系统崩溃。
- 分析:拒绝策略选
CallerRunsPolicy时,主线程阻塞导致Tomcat线程耗尽。 - 解法:动态线程池配置(Apollo+监控告警) + 有界队列强制降级。
二、数据库与缓存高阶对抗(日均亿级流量设计)
1. MySQL事务隔离级别的隐藏代价
- RR级别下的锁升级:当WHERE条件未命中索引时,如何从行锁退化为表锁?
-- 事务A UPDATEaccountSET balance=balance-100WHERE user_id=1;UPDATEaccountSET balance=balance+100WHERE user_id=2;-- 事务B UPDATEaccountSET balance=balance+100WHERE user_id=2;UPDATEaccountSET balance=balance-100WHERE user_id=1;
如何通过SHOW ENGINE INNODB STATUS分析死锁日志?
2. Redis多级缓存架构设计
- 本地缓存雪崩:Caffeine+TTL随机偏移量 + 降级开关
// 使用Redis的hotkeys命令 redis-cli --hotkeys --pattern "user:*"
- 跨机房同步方案:CRDT冲突解决算法在购物车场景的应用。
三、算法地狱模式(字节特色题型解析)
1. 分布式Top K问题
- 场景:100亿条搜索日志,找出Top1000高频词(禁止使用MapReduce)。
- 阶段二:Winner树多路归并 + 布隆过滤器去重
2. 时空复杂度双杀题
public ListNode detectCycle(ListNode head){ ListNode slow = head, fast = head;while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; if (slow == fast) break; }if (fast == null || fast.next.next == null) returnnull; slow = head;while (slow != fast) { slow = slow.next; fast = fast.next; }return slow;}
- Floyd算法数学证明:设环前长度L,环周长C,相遇时slow走了L+D,fast走了L+D+nC。
四、系统设计降维打击(P8级深度考察)
1. 全局唯一ID生成器设计
- 雪花算法缺陷:时钟回拨导致ID重复的5种解决方案(NTP同步、预留位、故障转移)。
| 1bit保留 | 41bit时间戳 | 4bit单元ID | 6bit机器ID | 12bit序列号 |
2. 百万人秒杀系统设计
graph LR A[Redis预扣库存] --> B[MQ异步落库]B --> C[MySQL最终一致性校验]
- 作弊防御:Lua脚本实现令牌桶限流 + 用户行为画像6。
五、绝杀技巧:如何让面试官主动加面?
1. 项目深挖话术模板
- STAR法则加强版:"在QPS从5000突增到5万的瞬间,我通过Guava分层缓存+动态熔断策略,将RT从2s降至200ms"。
2. 压力测试应答策略
- 当被质疑方案:"您提到的CAP理论确实关键,我们在方案评审时曾考虑过...最终选择最终一致性是因为..."。
3. 反问环节心机问题
- "请问抖音电商的订单系统是否采用ShardingSphere分库分表?遇到热点商户如何处理?"