Java核心知识体系

JVM内存模型
集合框架
IO与NIO

JVM内存结构与垃圾回收

JVM(Java虚拟机)是Java跨平台的核心。理解其内存模型对于排查OOM(OutOfMemoryError)和CPU飙高问题至关重要。

  • 堆内存(Heap): 存储对象实例,是GC的主要区域。分为新生代(Eden, Survivor)和老年代。
  • 栈内存(Stack): 存储局部变量、操作数栈、方法出口等。每个线程私有。
  • 方法区(Method Area): 存储类信息、常量、静态变量。在Java 8之后被元空间(Metaspace)取代。
  • 直接内存(Direct Memory): 不属于JVM运行时数据区,但可能被OOM。常用于NIO操作。
// 常见的JVM参数配置示例
-Xms2g -Xmx2g          // 初始堆和最大堆内存
-XX:+UseG1GC           // 使用G1垃圾收集器
-XX:MaxGCPauseMillis=200 // 最大GC停顿时间

常用集合类底层原理

集合框架是Java开发中最常用的组件之一。面试官常问HashMap、ArrayList、ConcurrentHashMap的实现细节。

集合类 底层结构 特点 线程安全
ArrayList 动态数组 查询快,增删慢,支持随机访问 否
LinkedList 双向链表 增删快,查询慢,适合频繁插入删除 否
HashMap 数组+链表/红黑树 键值对存储,O(1)查询,允许null键 否
ConcurrentHashMap 数组+链表/红黑树+CAS+synchronized 高并发下性能优于Hashtable和Collections.synchronizedMap 是

IO模型与NIO

Java IO经历了从BIO(阻塞IO)到NIO(非阻塞IO)再到AIO(异步IO)的演变。Netty等高性能框架基于NIO构建。

BIO: 每个连接创建一个线程,适合连接数少且固定的场景。

NIO: 支持多路复用器Selector,一个线程可以处理多个连接,适合高并发场景。

AIO: 异步非阻塞,操作系统完成后回调通知,使用场景相对较少。

MySQL与Redis深度解析

考点一:索引优化
B+树索引结构详解

MySQL InnoDB引擎默认使用B+树作为索引结构。与B树相比,B+树所有数据都存储在叶子节点,非叶子节点只存储键值,这使得B+树的高度更低,查询效率更稳定。且叶子节点之间通过双向链表连接,非常适合范围查询。

聚簇索引与非聚簇索引: 聚簇索引的叶子节点存储完整行数据,通常为主键索引;非聚簇索引(二级索引)叶子节点存储主键ID。回表查询需要通过二级索引找到主键,再回聚簇索引查数据,可通过覆盖索引优化。

考点二:事务隔离
MVCC与事务隔离级别

MySQL通过MVCC(多版本并发控制)实现非锁定读,提高了并发性能。结合Read View(读视图)判断数据的可见性。

  • 读未提交(Read Uncommitted): 可以看到其他事务未提交的数据。
  • 读已提交(Read Committed): Oracle默认,每次查询生成新的Read View,避免脏读,但可能出现不可重复读。
  • 可重复读(Repeatable Read): MySQL默认,事务开始时生成Read View,保证同一事务内多次读取结果一致,解决不可重复读。
  • 串行化(Serializable): 最高隔离级别,通过锁实现,性能最差。
考点三:Redis持久化
RDB与AOF对比

RDB(Redis Database)是快照形式,定期将内存数据写入磁盘,恢复速度快但可能丢失最后一次快照后的数据。AOF(Append Only File)记录每条写命令,数据安全性高但文件体积大,恢复速度慢。生产环境通常两者结合使用。

分布式架构与中间件

在微服务架构下,分布式一致性、服务治理和消息队列是后端开发的难点。以下是核心知识点的梳理。

分布式锁实现

基于Redis的Redlock算法或Zookeeper的临时顺序节点均可实现分布式锁。关键在于锁的过期时间、看门狗机制(自动续期)以及原子性(SETNX + EXPIRE)。

消息队列积压处理

Kafka/RocketMQ积压时,紧急方案包括:增加Topic分区、临时扩容消费者实例、编写快速消费程序(丢弃部分非核心逻辑)。

CAP理论与BASE

CAP指一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)。分布式系统无法同时满足三者,通常牺牲一致性换取可用性(AP)或牺牲可用性换取一致性(CP)。

系统设计案例

如何设计一个短链接生成系统?

短链接系统是后端面试中的经典系统设计题,考察点包括哈希算法、数据库存储、重定向逻辑等。

  1. 短码生成策略:
    • 哈希截断: 对URL进行MD5或SHA1哈希,取前几位作为短码。缺点是有冲突,需要处理碰撞。
    • 自增ID转62进制: 使用数据库自增ID,转换为62进制(0-9, a-z, A-Z)字符串。优点是无冲突,缺点是ID泄露可推测流量。
    • 分布式ID: 使用Snowflake算法生成全局唯一ID,再转62进制。适合高并发场景。
  2. 存储设计:
    • 短码作为主键,长URL作为值。
    • 可使用MySQL存储,初期数据量不大时性能足够。后期可分库分表或使用Redis缓存热点短链。
  3. 重定向逻辑:
    • 收到短链接请求,解析短码,查询数据库或缓存获取长URL。
    • 返回301(永久重定向)或302(临时重定向)。301有利于SEO,302更灵活。
  4. 高可用与缓存:
    • 热点短链接优先从Redis读取,减轻数据库压力。
    • 设置合理的过期时间,定期清理无效短链。