面灵AI

阿里后端开发面经05

时间
2025-04
来源
牛客网

《面试题目》

  1. 在浏览器地址栏输入 URL 后会发生什么?
  2. HTTP 常见状态码有哪些?
  3. Cookie 和 Session 有什么区别?
  4. 死锁的产生条件是什么?如何解决死锁?
  5. 操作系统有哪些内存管理方式?
  6. 什么是 Java 反射?通常在哪些场景使用?
  7. Java 堆分为哪些区域?对象如何在这些区域中流转?
  8. 常见的垃圾回收策略有哪些?
  9. JVM 调优常用哪些命令?
  10. 线上频繁发生 GC 时如何定位问题?
  11. Java 线程有哪些状态?
  12. 哪些场景适合使用线程池?为什么要使用线程池?
  13. MySQL 有哪些事务隔离级别?它们有什么区别?
  14. Redis 为什么快?
  15. 如何使用回溯算法完成组合总和问题(LeetCode 39)?

《参考解析》

1. URL 请求链路:浏览器先解析 URL,检查缓存并完成 DNS 查询,随后建立 TCP 连接;HTTPS 还需要进行 TLS 握手。请求经过代理或负载均衡到达应用,服务端返回响应后,浏览器解析 HTML、加载子资源并完成布局和绘制。

2. 死锁处理:死锁需要同时满足互斥、占有且等待、不可抢占和循环等待。工程上可通过固定加锁顺序、缩小锁范围、超时释放、一次性申请资源以及死锁检测来破坏其中一个条件。

3. 频繁 GC 排查:先用监控确认 Young GC、Full GC 的频率和停顿,再结合 jstat、GC 日志、堆转储和线程栈观察对象分配速率、晋升失败、大对象和内存泄漏。定位持有链后再决定优化对象生命周期、堆参数或收集器,不能只靠扩大堆掩盖问题。

4. MySQL 隔离级别:从低到高依次为读未提交、读已提交、可重复读和串行化。InnoDB 默认使用可重复读,通过 MVCC 与锁机制处理并发读取;隔离越强,通常并发成本越高。

5. 组合总和:先排序候选数组,使用深度优先搜索枚举组合。由于同一元素可以重复使用,递归时继续从当前下标搜索;当累加值达到目标时记录答案,超过目标时剪枝,同层跳过重复元素以避免重复组合。