1. HashMap 底层实现
数组 + 链表 + 红黑树。默认容量 16,负载因子 0.75,链表长度 >8 且数组长度 ≥64 时树化。hash() 用高 16 位异或低 16 位减少碰撞。扩容时 1.8 采用高位拆分,避免死循环。
2. synchronized 与 Lock 区别
| 维度 | synchronized | ReentrantLock | | --- | --- | --- | | 实现 | JVM 关键字 | JDK 层 AQS | | 释放 | 自动 | 必须 finally unlock | | 可中断 | 否 | 是 | | 公平锁 | 否 | 支持 | | 条件队列 | 1个 | 多个 Condition |3. volatile 的作用
- 保证可见性(MESI 缓存一致性 + 总线嗅探)
- 禁止指令重排序(内存屏障)
- 不保证原子性(
i++仍需加锁或用 AtomicInteger)
4. ThreadLocal 内存泄漏
ThreadLocalMap 的 key 是弱引用,value 是强引用。线程池复用线程导致 value 无法回收。必须 remove()。
5. Spring Bean 生命周期
实例化 → 属性填充 →BeanNameAware → BeanPostProcessor.before → InitializingBean → init-method → after → 使用 → DisposableBean → destroy
6. Spring 循环依赖怎么解决
三级缓存:singletonObjects(成品)、earlySingletonObjects(半成品)、singletonFactories(工厂)。只能解决单例 setter 注入,构造器注入无法解决。
7. MySQL 事务隔离级别
| 级别 | 脏读 | 不可重复读 | 幻读 | | --- | --- | --- | --- | | 读未提交 | ✅ | ✅ | ✅ | | 读已提交 | ❌ | ✅ | ✅ | | 可重复读(默认)| ❌ | ❌ | 部分 | | 串行化 | ❌ | ❌ | ❌ |RR 通过 MVCC + 间隙锁解决大部分幻读。
8. 索引为什么用 B+ 树
- 树高低(千万数据 3-4 层),磁盘 IO 次数少
- 叶子节点链表相连,范围查询高效
- 非叶子节点不存数据,单页可容纳更多 key
9. Redis 为什么快
- 纯内存操作
- 单线程避免上下文切换与锁竞争
- IO 多路复用(epoll)
- 高效数据结构(SDS、跳表、压缩列表)
10. 缓存穿透 / 击穿 / 雪崩
- 穿透:查不存在的 key → 布隆过滤器 / 缓存空值
- 击穿:热点 key 过期瞬间高并发 → 互斥锁 / 逻辑过期
- 雪崩:大量 key 同时过期 → 过期时间加随机值
11. CAP 理论
一致性、可用性、分区容错性三者只能取其二。分布式系统必然存在 P,所以实际在 C 与 A 之间权衡。12. 如何保证缓存与数据库一致性
推荐:先更新数据库,再删除缓存,配合消息队列重试 + 延迟双删。13. 分布式 ID 方案
UUID(无序)、数据库号段、Redis INCR、Snowflake 雪花算法(推荐,41位时间+10位机器+12位序列)。14. 消息队列如何保证不丢消息
- 生产者:confirm 机制 + 重试
- Broker:持久化 + 多副本
- 消费者:手动 ack
15. 幂等性设计
唯一索引、Token 机制、状态机、分布式锁、乐观锁版本号。16. JVM 调优参数
-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200
17. 线程池任务执行流程
核心线程 → 队列 → 最大线程 → 拒绝策略。18. 什么是幂等、什么是重放
幂等:多次执行结果一致。重放:请求被重复发送。防护:加 timestamp + nonce + 签名。19. 微服务熔断降级
Sentinel / Hystrix:慢调用比例、异常比例触发熔断,快速失败返回降级结果。20. 如何排查线上 OOM
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/
jmap -dump:format=b,file=heap.hprof <pid>
# 用 MAT / VisualVM 分析
评论(0)
还没有评论,来说两句吧