性能调优经典面试题及答案(后端/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)
相关推荐
小Tomkk21 分钟前
mysql 最长连续登录天数解析
数据库·mysql
快来卷java1 小时前
深入剖析雪花算法:分布式ID生成的核心方案
java·数据库·redis·分布式·算法·缓存·dreamweaver
tpoog1 小时前
[MySQL]数据类型
android·开发语言·数据库·mysql·算法·adb·贪心算法
爱吃喵的鲤鱼1 小时前
MySQL增删改查(CRUD)操作详解与实战指南
数据库·mysql
啞謎专家2 小时前
在rockylinux9.4安装mongodb报错:缺少:libcrypto.so.10文件库
数据库·mongodb
chat2tomorrow3 小时前
数据仓库是什么?数据仓库的前世今生 (数据仓库系列一)
大数据·数据库·数据仓库·低代码·华为·spark·sql2api
ssxueyi3 小时前
StarRocks 部署:依赖环境
服务器·数据库·starrocks·php
.又是新的一天.3 小时前
02_MySQL安装及配置
android·数据库·mysql
库海无涯4 小时前
如何把数据从SQLite迁移到PostgreSQL
数据库·postgresql·sqlite
明明明h4 小时前
MySQL 查看本地用户名和密码
数据库·mysql·adb