性能调优经典面试题及答案(后端/JVM/数据库方向)
一、JVM性能调优
1. 描述JVM内存模型及垃圾回收机制
答案要点:
- 内存分区 :
- 堆(新生代Eden/Survivor区、老年代)
- 方法区(元空间)
- 虚拟机栈、本地方法栈、程序计数器
- 对象分配流程 :
- 对象优先在Eden区分配
- 大对象直接进入老年代
- 长期存活对象(默认15次GC)晋升老年代
- 垃圾收集器 :
- Serial/Parallel:适合单核/多核小内存
- CMS:并发标记清除,低停顿但会产生碎片
- G1:分Region收集,可预测停顿时间
- ZGC:超低延迟(JDK11+)
2. 如何排查和解决OOM问题?
排查步骤:
- 使用
jmap -dump:format=b,file=heap.hprof <pid>
生成堆转储文件 - 用MAT/Eclipse Memory Analyzer分析内存泄漏
- 检查大对象分配(如大数组、未释放的资源)
- 分析GC日志(-XX:+PrintGCDetails)
解决方案:
- 调整堆大小(-Xms, -Xmx)
- 优化新生代/老年代比例(-XX:NewRatio)
- 修复内存泄漏代码(如未关闭的连接、静态集合)
- 使用堆外内存处理大对象
3. 如何选择垃圾收集器?
选择策略:
- 吞吐量优先:Parallel Scavenge + Parallel Old
- 低延迟优先:CMS(JDK8)或G1(JDK9+)
- 超大堆(>8G):G1或ZGC
- 云原生环境:Shenandoah(JDK12+)
二、数据库性能优化
4. MySQL索引优化原则
核心原则:
- 最左前缀匹配原则
- 避免索引失效场景:
- 对索引列使用函数/运算
- 隐式类型转换
- 使用
!=
或NOT IN
- 前导模糊查询(LIKE '%xxx')
- 使用覆盖索引减少回表
- 推荐自增主键(避免页分裂)
高级技巧:
- 索引下推(ICP,MySQL5.6+)
- MRR多范围读取优化
- 使用
FORCE INDEX
强制索引
5. 如何处理千万级大表查询?
优化方案:
- 分库分表 :
- 水平分表(按时间/ID范围)
- 垂直分表(按字段热度)
- 查询优化 :
- 避免
SELECT *
,只查必要字段 - 使用
EXPLAIN
分析执行计划 - 合理使用覆盖索引
- 避免
- 架构升级 :
- 读写分离
- 引入缓存层(Redis)
- 使用列式存储(如ClickHouse)处理分析型查询
6. 如何优化慢SQL?
排查流程:
- 开启慢查询日志(slow_query_log)
- 使用
EXPLAIN
分析执行计划 - 关注关键指标:
- type(至少达到range)
- possible_keys vs key
- rows扫描行数
- Extra中的"Using filesort"等警告
优化手段:
- 重建不合理的索引
- 重写复杂查询(拆分为多个简单查询)
- 使用临时表预计算
- 调整join_buffer_size等参数
三、高并发系统优化
7. 如何设计高并发系统的缓存策略?
多级缓存架构:
- 客户端缓存(HTTP缓存头)
- CDN边缘缓存
- 应用层缓存(Guava Cache/Caffeine)
- 分布式缓存(Redis/Memcached)
- 数据库缓存(Buffer Pool)
Redis优化要点:
- 合理设置过期时间
- 使用Pipeline减少网络往返
- 大Key拆分(避免单Value过大)
- 热点Key本地缓存+随机过期
8. 如何解决缓存穿透/雪崩/击穿?
缓存穿透(查询不存在数据):
- 布隆过滤器拦截
- 缓存空对象(设置短过期时间)
缓存雪崩(大量key同时失效):
- 随机过期时间
- 多级缓存
- 熔断降级机制
缓存击穿(热点key失效):
- 互斥锁重建缓存
- 逻辑过期(后台异步更新)
四、性能调优方法论
9. 性能调优的标准流程
-
指标量化:
- 确定QPS、RT、错误率等基线指标
- 使用APM工具(SkyWalking/Prometheus)监控
-
瓶颈定位:
- CPU瓶颈:top -H,jstack
- 内存瓶颈:jmap,GC日志
- IO瓶颈:iostat,vmstat
-
优化实施:
- 代码层:算法优化、并发控制
- JVM层:参数调优、GC策略
- 架构层:缓存、异步、分片
-
效果验证:
- 压力测试(JMeter/Gatling)
- A/B测试对比
10. 常用性能分析工具
场景 | 工具 |
---|---|
JVM分析 | VisualVM, Arthas, JProfiler |
线程分析 | jstack, Async-Profiler |
内存分析 | MAT, jmap, jstat |
数据库分析 | Explain, pt-query-digest |
系统监控 | Grafana+Prometheus, nmon |
高级技巧:
- Arthas热修复(redefine)
- JIT编译分析(-XX:+PrintCompilation)
- 火焰图生成(Async-Profiler)