性能调优经典面试题及答案(后端/JVM/数据库方向)

性能调优经典面试题及答案(后端/JVM/数据库方向)

一、JVM性能调优

1. 描述JVM内存模型及垃圾回收机制

答案要点:

  • 内存分区 :
    • 堆(新生代Eden/Survivor区、老年代)
    • 方法区(元空间)
    • 虚拟机栈、本地方法栈、程序计数器
  • 对象分配流程 :
    • 对象优先在Eden区分配
    • 大对象直接进入老年代
    • 长期存活对象(默认15次GC)晋升老年代
  • 垃圾收集器 :
    • Serial/Parallel:适合单核/多核小内存
    • CMS:并发标记清除,低停顿但会产生碎片
    • G1:分Region收集,可预测停顿时间
    • ZGC:超低延迟(JDK11+)

2. 如何排查和解决OOM问题?

排查步骤:

  1. 使用jmap -dump:format=b,file=heap.hprof <pid>生成堆转储文件
  2. 用MAT/Eclipse Memory Analyzer分析内存泄漏
  3. 检查大对象分配(如大数组、未释放的资源)
  4. 分析GC日志(-XX:+PrintGCDetails)

解决方案:

  • 调整堆大小(-Xms, -Xmx)
  • 优化新生代/老年代比例(-XX:NewRatio)
  • 修复内存泄漏代码(如未关闭的连接、静态集合)
  • 使用堆外内存处理大对象

3. 如何选择垃圾收集器?

选择策略:

  • 吞吐量优先:Parallel Scavenge + Parallel Old
  • 低延迟优先:CMS(JDK8)或G1(JDK9+)
  • 超大堆(>8G):G1或ZGC
  • 云原生环境:Shenandoah(JDK12+)

二、数据库性能优化

4. MySQL索引优化原则

核心原则:

  1. 最左前缀匹配原则
  2. 避免索引失效场景:
    • 对索引列使用函数/运算
    • 隐式类型转换
    • 使用!=或NOT IN
    • 前导模糊查询(LIKE '%xxx')
  3. 使用覆盖索引减少回表
  4. 推荐自增主键(避免页分裂)

高级技巧:

  • 索引下推(ICP,MySQL5.6+)
  • MRR多范围读取优化
  • 使用FORCE INDEX强制索引

5. 如何处理千万级大表查询?

优化方案:

  • 分库分表 :
    • 水平分表(按时间/ID范围)
    • 垂直分表(按字段热度)
  • 查询优化 :
    • 避免SELECT *,只查必要字段
    • 使用EXPLAIN分析执行计划
    • 合理使用覆盖索引
  • 架构升级 :
    • 读写分离
    • 引入缓存层(Redis)
    • 使用列式存储(如ClickHouse)处理分析型查询

6. 如何优化慢SQL?

排查流程:

  1. 开启慢查询日志(slow_query_log)
  2. 使用EXPLAIN分析执行计划
  3. 关注关键指标:
    • type(至少达到range)
    • possible_keys vs key
    • rows扫描行数
    • Extra中的"Using filesort"等警告

优化手段:

  • 重建不合理的索引
  • 重写复杂查询(拆分为多个简单查询)
  • 使用临时表预计算
  • 调整join_buffer_size等参数

三、高并发系统优化

7. 如何设计高并发系统的缓存策略?

多级缓存架构:

  1. 客户端缓存(HTTP缓存头)
  2. CDN边缘缓存
  3. 应用层缓存(Guava Cache/Caffeine)
  4. 分布式缓存(Redis/Memcached)
  5. 数据库缓存(Buffer Pool)

Redis优化要点:

  • 合理设置过期时间
  • 使用Pipeline减少网络往返
  • 大Key拆分(避免单Value过大)
  • 热点Key本地缓存+随机过期

8. 如何解决缓存穿透/雪崩/击穿?

缓存穿透(查询不存在数据):

  • 布隆过滤器拦截
  • 缓存空对象(设置短过期时间)

缓存雪崩(大量key同时失效):

  • 随机过期时间
  • 多级缓存
  • 熔断降级机制

缓存击穿(热点key失效):

  • 互斥锁重建缓存
  • 逻辑过期(后台异步更新)

四、性能调优方法论

9. 性能调优的标准流程

  1. 指标量化:

    • 确定QPS、RT、错误率等基线指标
    • 使用APM工具(SkyWalking/Prometheus)监控
  2. 瓶颈定位:

    • CPU瓶颈:top -H,jstack
    • 内存瓶颈:jmap,GC日志
    • IO瓶颈:iostat,vmstat
  3. 优化实施:

    • 代码层:算法优化、并发控制
    • JVM层:参数调优、GC策略
    • 架构层:缓存、异步、分片
  4. 效果验证:

    • 压力测试(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)
相关推荐
草莓熊Lotso3 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
Lethehong9 小时前
Oracle 加个字段,目标库就报错?KFS 用“先拆后组“打通异构 DDL
数据库·oracle
Web极客码9 小时前
锁定真正的磁盘卡顿:我用 OpenCode 配合 eBPF 诊断 NVMe 队列深度延迟与 I/O 写放大
数据库·oracle
CS创新实验室9 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
cspttty10 小时前
2027用户研究求职准备:应用统计学如何补齐研究设计与业务表达
大数据·数据库
roman_日积跬步-终至千里11 小时前
【数据Agent论文·查询与语义|05】Spider:为什么换一个数据库,模型就不会查了?
数据库·数据分析
猫咪很可爱11 小时前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle
XLYcmy11 小时前
《数字经济赋能城市低碳治理的路径研究检索报告》审阅与修改指导意见——基于完整检索报告体例的完整性诊断、学术规范核查与方法论纠偏 上
数据库·ai·chatgpt·文心一言·检索·知网·豆包
泡海椒11 小时前
JQuick-SQL 快速开始:注册内存表并执行查询
数据库·windows·sql
ss27312 小时前
PG实战笔记 | 09 PostgreSQL psql客户端基本操作
数据库·笔记·postgresql