本文列出并详细回答了JVM面试中的常见问题,涵盖JVM内存结构(程序计数器、虚拟机栈、本地方法栈、堆、方法区、直接内存)、垃圾回收原理(根可达、引用计数、分代收集、标记清除/复制/整理、三色标记、STW与安全点、OopMap、Safe Region)、GC Roots的种类、四种引用类型、常见收集器及其特性(Serial、ParNew、Parallel Scavenge/Old、CMS等),以及类加载机制、对象栈上分配、内存布局和OOM排查等内容。通过这些答案帮助读者系统掌握JVM内部机制,提升面试竞争力。

本文以“面试现场综合篇”为框架,列出常见高频面试题并给出要点式解答,涵盖项目亮点、零拷贝实现原理、五种IO模型及NIO 与多路复用区别、Future 阻塞获取结果的内部机制、ReentrantLock 与 synchronized 的实现与差异、AQS、乐观/悲观锁、Paxos 流程、B+树特性、TCP 拥塞控制、JVM 调优、分库分表缺点与分布式事务(TCC)方案、RocketMQ 消息可靠性保障以及简单算法示例,帮助读者快速梳理面试重点并掌握核心概念。

在多线程环境中,多个线程可能同时访问共享可变资源,必须通过同步机制实现对临界资源的互斥访问。Java 提供的 synchronized 基于对象的 Monitor 锁实现,采用 monitorenter/monitorexit 指令并在对象头的 Mark Word 中记录锁状态。JVM 对内置锁进行多层优化:偏向锁、轻量级锁、自旋锁、锁膨胀(向重量级锁升级)以及锁消除(通过逃逸分析)。对象头结构、压缩指针(Compressed Oops)以及 JOL 等工具帮助分析锁状态和内存布局。整体上,synchronized 通过加锁实现序列化访问,其底层实现与性能优化相互配合,以在保证线程安全的前提下尽量降低开销。

零拷贝是一种 I/O 优化技术,指在数据传输过程中不进行用户态与内核态之间的拷贝,从而减少上下文切换和 CPU 负担。文章先阐述传统 read/write 流程需四次态切换、四次拷贝,并回顾内核/用户空间、上下文切换、虚拟内存和 DMA 的基本概念。随后介绍三种零拷贝实现方式:mmap + write(减少一次 CPU 拷贝),sendfile(仅两次态切换、一次 CPU 拷贝),以及带 DMA scatter/gather 的 sendfile(全部由 DMA 完成,真正零拷贝)。最后说明 Java NIO 中的 MappedByteBuffer(基于 mmap)和 FileChannel.transferTo/transferFrom(基于 sendfile)提供了零拷贝能力,常用于高性能消息系统如 Kafka。

幂等指一次和多次请求产生同等副作用,确保重复调用不会导致业务错误。系统间远程调用常出现超时,若下游实现幂等,上游可安全重试,避免如转账重复扣款、消息重复消费等问题。实现幂等的关键是为每个请求生成全局唯一标识(如 UUID、Snowflake、Uidgenerator、Leaf),并在业务层通过唯一索引、主键冲突、状态机、独立防重表、Token、悲观锁、乐观锁、分布式锁等八种方式过滤已处理请求。文中还说明了 HTTP 方法的幂等性:GET、HEAD、OPTIONS、DELETE、PUT 为幂等,POST 则不具幂等性。

本文梳理了MQ面试十个关键点:阐述消息队列概念及RabbitMQ、RocketMQ、Kafka等实现;列举解耦、削峰、异步、通讯、远程调用等场景;从生产、存储、消费三阶段说明防止消息丢失的措施;讲解顺序消费、重复消费的幂等处理及积压排查与扩容思路;对三大中间件在性能、模型、持久化等方面做对比并给出选型建议;介绍集群复制、Leader‑Follower实现高可用;解析事务消息确保最终一致性;提出自研MQ的架构设计要点。