Skip to content

2025年度技术测试知识点

About 3622 wordsAbout 12 min

2025-08-04

Java高级工程师”技术测评,覆盖范围非常典型且全面(JVM、多线程&锁、分布式、数据库优化、复杂算法、复杂系统设计),这确实是高级工程师的核心能力要求。以下是系统的准备建议,帮助你高效复习:

核心策略:深度理解原理 + 结合实践经验 + 清晰表达能力

1. Java 核心 (JVM, 多线程&锁)

  • JVM:
    • 内存模型: 熟练掌握堆、栈、方法区(元空间)、程序计数器、本地方法栈的结构、作用及其相互关系。重点理解堆内存的分代(Eden, S0/S1, Old)和垃圾回收发生的位置。
    • 垃圾回收: 深入理解常用GC算法(标记-清除、标记-整理、复制)及其优缺点。重点掌握常见的GC收集器(Serial, Parallel Scavenge/CMS, G1, ZGC, Shenandoah)工作原理、适用场景、核心参数调优(如堆大小、新生代老年代比例、GC日志分析)。理解Stop-The-World的概念和影响。
    • 类加载机制: 理解双亲委派模型、类加载过程(加载、链接、初始化)、自定义类加载器的作用。
    • 内存问题诊断: 熟悉常用工具(jps, jstat, jmap, jstack, jconsole, VisualVM, MAT)的使用场景,能分析OOM、内存泄漏、高CPU、线程死锁等问题。
    • 字节码与执行引擎: 了解字节码的基本结构,理解解释执行、JIT编译(尤其是热点代码探测、C1/C2编译器)的基本概念。
  • 多线程 & 锁:
    • 线程基础: 线程状态及转换、创建线程的方式(继承Thread vs 实现Runnable vs Callable+Future/FutureTask)、线程池(核心参数、工作原理、拒绝策略、选型 - ThreadPoolExecutor, Executors工厂方法的陷阱)。
    • 线程安全: 深刻理解原子性、可见性、有序性。理解Java内存模型(JMM)、happens-before原则。
    • 锁机制:
      • synchronized 理解其实现原理(对象头中的Mark Word、锁升级过程:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁)、使用范围(方法、代码块)、锁重入。
      • ReentrantLock 理解其与synchronized的区别(可中断、公平锁、条件变量)、实现原理(AQS - AbstractQueuedSynchronizer)。务必搞懂AQS的核心思想(CLH队列、state变量)和ReentrantLock如何基于AQS实现。
      • 其他锁: 了解ReentrantReadWriteLock, StampedLock的适用场景。
      • volatile 理解其保证可见性、禁止指令重排序的原理(内存屏障),以及不能保证原子性的限制。
    • 并发工具类: 熟练掌握CountDownLatch, CyclicBarrier, Semaphore, Exchanger, Phaser的使用场景和原理。重点掌握ConcurrentHashMap的高效实现原理(JDK7分段锁 vs JDK8 CAS+synchronized)。理解CopyOnWriteArrayList, BlockingQueue (ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue, DelayQueue)等。
    • 原子类: 理解AtomicInteger, AtomicReference等基于CAS的实现原理。
    • 线程协作: 理解wait(), notify(), notifyAll()的使用及其限制,能用Condition替代。

准备要点: 画图理解内存模型、锁升级、AQS队列。结合自己项目中遇到的并发问题(死锁、性能瓶颈、线程安全Bug)思考解决方案。理解“为什么”比记住“是什么”更重要。

2. 分布式技术

  • 核心概念: CAP定理、BASE理论、分布式事务(难点)、一致性模型(强一致性、最终一致性等)、分布式ID生成方案(Snowflake等)。
  • 服务治理:
    • RPC框架: 理解核心原理(动态代理、序列化、网络通信 - Netty、服务注册发现、负载均衡、熔断降级、超时重试)。熟悉Dubbo或Spring Cloud Alibaba的核心组件(Nacos, Sentinel, Seata, Dubbo本身)。
    • 服务注册与发现: Eureka, Consul, Nacos, Zookeeper的原理与对比。
    • 负载均衡: 常用策略(随机、轮询、加权、最少连接、一致性哈希)及其实现。
    • 熔断与降级: Hystrix, Sentinel的原理和应用场景。
    • 配置中心: Apollo, Nacos Config的原理。
  • 分布式缓存:
    • Redis: 精通数据结构及应用场景、持久化(RDB/AOF)、高可用(主从、哨兵、Cluster)、集群分片、淘汰策略、管道/Pipeline、Lua脚本、事务、缓存穿透/击穿/雪崩的解决方案。理解Redis单线程模型为何高效。
    • Memcached: 了解其与Redis的主要区别(多线程、无持久化、数据结构单一)。
  • 消息队列:
    • 核心概念: 解耦、异步、削峰填谷、顺序性、重复消费、消息丢失。
    • 主流MQ: 深入掌握 Kafka(高吞吐、分区、副本、ISR、Exactly-Once语义)、RocketMQ(事务消息、顺序消息、延迟消息)、RabbitMQ(Exchange类型、路由、ACK机制)的核心原理、架构、特性和选型依据。
  • 分布式事务:
    • 理解难点: 刚性事务(XA)在分布式环境下的性能问题和复杂依赖。
    • 柔性事务: 重点掌握 TCC(Try-Confirm-Cancel)模式、基于可靠消息(RocketMQ事务消息)的最终一致性方案、最大努力通知。了解Seata的AT模式原理。
  • 分布式锁: 基于Redis(SETNX + Lua)、Zookeeper(临时顺序节点)、Etcd的实现方案及其优缺点(可靠性、性能、死锁预防)。

准备要点: 理解分布式带来的挑战(网络分区、节点故障、时钟不一致)及应对策略。思考你项目中是如何应用这些技术的,遇到了什么问题,如何解决的。对比不同方案的优劣。

3. 数据库 (性能优化)

  • SQL优化:
    • 执行计划: 必须精通 如何查看和分析(EXPLAIN / EXPLAIN ANALYZE),理解关键字段(type, key, rows, Extra)。
    • 索引: 深入理解B+树索引原理、聚集索引/非聚集索引、覆盖索引、最左前缀原则。索引失效的常见场景(函数、计算、类型转换、OR!=, NOT LIKE、范围查询后的列)。何时该建索引?何时不该建?
    • 高效SQL: 避免SELECT *,使用LIMIT分页,优化JOIN(小表驱动大表),优化子查询(尽量用JOIN),合理使用UNION ALL vs UNION。理解批处理的重要性。
  • 数据库设计与建模:
    • 范式(1NF, 2NF, 3NF, BCNF)的理解与权衡(规范化 vs 查询性能)。
    • 选择合适的数据类型。
    • 分库分表:核心解决方案! 理解垂直拆分、水平拆分的场景。掌握路由策略(取模、范围、一致性哈希)、分库分表带来的问题(分布式事务、全局ID、跨库JOIN/排序分页)及常见解决方案(ShardingSphere, MyCat)。
  • 事务与锁:
    • 理解ACID特性。
    • 隔离级别(Read Uncommitted, Read Committed, Repeatable Read, Serializable)及它们解决的问题(脏读、不可重复读、幻读)和带来的问题(锁竞争、性能)。MVCC(多版本并发控制)的实现原理(InnoDB的ReadView)。
    • 理解行锁、表锁、间隙锁、临键锁、意向锁。
  • 连接池: 理解其重要性(减少连接创建销毁开销),熟悉HikariCP, Druid等,理解核心配置参数(最大/最小连接数、超时时间等)。
  • 数据库选型与引擎: 了解MySQL InnoDB vs MyISAM的核心区别(事务、锁、外键、崩溃恢复)。了解其他数据库如PostgreSQL的特点。
  • 慢查询分析: 熟练使用慢查询日志,定位并优化慢SQL。
  • 读写分离: 原理、实现方式(中间件、框架支持)、数据同步延迟问题。

准备要点: 性能优化是重点! 结合你经历过的真实慢SQL案例,说明你是如何分析(看执行计划)和优化的(加索引、改写SQL、调整设计)。理解分库分表是应对海量数据的关键手段。

4. 复杂算法

  • 基础回顾: 时间复杂度、空间复杂度的分析与表示法(Big O)。基础数据结构(数组、链表、栈、队列、树、图、哈希表)的操作和特性。
  • 重点算法思想:
    • 排序: 快速排序、归并排序、堆排序的原理、时间/空间复杂度、稳定性。理解JDK中Arrays.sort()的混合策略(TimSort)。
    • 查找: 二分查找及其变种。
    • 递归与分治: 理解思想(如归并排序、快速排序)。
    • 动态规划: 高频考点! 理解核心思想(最优子结构、重叠子问题、状态转移方程)。经典问题:斐波那契数列(优化)、背包问题(01背包、完全背包)、最长公共子序列、最长递增子序列、编辑距离、股票买卖问题等。
    • 贪心算法: 理解思想(局部最优->全局最优?)及适用场景(如Huffman编码、部分背包问题)。
    • 回溯: 理解思想(尝试+剪枝),经典问题:N皇后、全排列、组合、子集、数独等。
    • BFS & DFS: 在图和树上的应用(层序遍历、最短路径-无权图、连通分量)。
  • 图算法: 最短路径(Dijkstra, Floyd)、最小生成树(Prim, Kruskal)、拓扑排序(依赖解析)等,了解原理和应用场景。
  • 字符串算法: KMP(理解Next数组构建)、Trie树(前缀树)、滑动窗口技巧。

准备要点: 刷题是必要的,但重在理解思想而非死记硬背代码。 优先掌握常见面试题和经典问题(力扣LeetCode上的中等难度题目是重点)。练习在白板或纸上清晰地写出代码,并解释思路和时间/空间复杂度。思考算法在实际工程中的应用(如Redis ZSet用跳表、数据库索引用B+树、路由算法用一致性哈希)。

5. 复杂系统设计

  • 核心目标: 设计一个满足功能性需求(做什么)和非功能性需求(做多好 - 高并发、高可用、可扩展、可维护、安全性)的系统。
  • 方法论:
    • 需求澄清: 明确功能、用户量级(QPS/TPS)、数据量、延迟要求、一致性要求、安全性要求等。主动提问澄清需求!
    • 估算: 进行粗略的容量估算(存储、带宽、服务器数量) - 非常重要!
    • 抽象与分层: 定义核心组件(API Gateway, 服务、数据库、缓存、消息队列、存储)及其职责和交互。
    • 数据模型设计: 设计核心实体及关系(关系型 or NoSQL?)。
    • 深入设计:
      • 高可用: 冗余(无状态服务、数据副本)、故障转移(心跳检测、自动切换)、消除单点故障、熔断降级、超时重试。
      • 高并发/可扩展: 水平扩展(加机器)、负载均衡、异步化(消息队列)、缓存、数据库读写分离、分库分表。
      • 数据一致性: 根据场景选择策略(强一致:分布式事务;最终一致:消息队列、重试补偿)。
      • 性能: 缓存、CDN、异步、批处理、数据库优化。
      • 安全性: 认证授权(OAuth2, JWT)、HTTPS、输入验证、防注入、防重放攻击、限流防刷。
    • 权衡: 在CAP、性能与成本、一致性与延迟之间做合理权衡。
  • 经典设计题:
    • 设计一个短链接系统(如TinyURL)
    • 设计一个分布式缓存系统(如Redis Cluster)
    • 设计一个聊天系统(如微信)
    • 设计一个抢购/秒杀系统(高频!重点准备
    • 设计一个新闻Feed流(如微博)
    • 设计一个API Gateway
    • 设计一个打车系统(Uber)
  • 表达技巧:
    • 清晰阐述设计目标、假设和约束。
    • 使用框图(组件图、数据流图)辅助说明。
    • 逐步演进设计(从简单开始,逐步添加高可用、高并发特性)。
    • 重点解释关键决策(如为什么选这种数据库?为什么用这种一致性模型?如何解决XX瓶颈?)。
    • 讨论可能的瓶颈和改进空间。

准备要点: 这是区分高级工程师的关键! 大量练习经典题目,学习优秀的设计方案(如Grokking the System Design Interview)。模拟面试场景,练习在白板上边画边讲。强调你的设计如何满足非功能性需求(NFRs)。思考你参与或设计的系统中,哪些体现了这些原则?

通用准备建议

  1. 回顾项目经验: 这是你最大的优势!梳理你负责过的核心项目、复杂模块,尤其是涉及并发、分布式、性能优化、系统设计、解决难题的部分。准备用STAR法则(Situation, Task, Action, Result)清晰地描述,并重点突出你的技术决策、权衡、解决的问题和取得的成果。量化结果(如性能提升XX%,QPS达到XX)更有说服力。
  2. 基础知识 vs 深度原理: 测评内容很广,不可能面面俱到到极致深度。确保核心基础(JVM内存模型、GC、线程池、synchronized/ReentrantLock/AQS、索引、事务隔离级别、基本算法思想、分布式事务方案)有扎实理解。对1-2个特别感兴趣或项目相关的领域(如Kafka原理、Redis Cluster、分库分表、某个特定分布式算法)可以准备得更深入。
  3. 动手实践: 对于关键概念(如JVM参数调优、分析线程Dump、写个死锁例子、实现一个简单AQS、写个DP算法、画个系统设计图),光看不够,动手写写画画理解更深刻。
  4. 模拟面试: 找朋友或同事模拟面试,特别是系统设计和算法题。练习在压力下清晰表达复杂概念的能力。注意表达的逻辑性和条理性。
  5. 保持良好状态: 保证充足睡眠,提前了解测评形式(笔试/面试/线上/线下?),准备好环境(如果是线上)。
  6. 态度: 自信但不自负。遇到不会的问题很正常,展示你的思考过程(“这个问题我之前了解不深,但根据我的理解,我觉得可能的思路是...”)比直接说“不会”要好得多。表现出积极学习和解决问题的态度。

时间分配建议(根据你个人基础和剩余时间调整):

  • 核心Java (JVM/并发): 25-30% - 这是基石。
  • 分布式技术: 20-25% - 高级工程师必备。
  • 数据库优化: 15-20% - 性能优化的核心战场。
  • 复杂系统设计: 20-25% - 展示架构能力的关键。
  • 复杂算法: 10-15% - 保持手感,理解思想。
  • 项目回顾与表达练习: 贯穿始终。

最后提醒: 高级工程师的测评,面试官更看重的是你对技术原理的深刻理解解决复杂问题的思路权衡取舍的能力以及将理论应用于实际项目的经验。展现你的技术深度、广度和工程化思维!

祝你测评顺利,取得好成绩!

Changelog

8/20/25, 11:06 AM
View All Changelog
  • 4c155-Merge branch 'dev1'on

求求了,快滚去学习!!!

求求了求求了,快去学习吧!

【题单】贪心算法

不知道方向的时候,可以多看看书,书会给你指明下一步该干什么,加油!