主题
Java 学习路线
本目录只做导航。每篇正文按「一句话 → 为什么需要 → 核心机制 → 最小上手 → 生产动作 → 边界 → 讲清楚」组织,版本以 JDK 17 / JDK 21 为主,旧版本差异在文中单独标注。
适用前提
- 能写 Java 基础语法,知道类、接口、异常和 Maven 的基本用法。
- 本机装有 JDK 17 或 JDK 21,
java -version能正常输出。 - 涉及 Native Image、Reactor、SSE 的篇目需要额外安装 GraalVM、引入 Maven 依赖或准备 Spring Boot 环境,篇内会给出命令。
阅读顺序
| 阶段 | 篇目 | 读完能做什么 | 前置 |
|---|---|---|---|
| 运行时 | 01-JVM内存模型与GC | 看懂堆与元空间、G1/ZGC 的取舍,能读一段 GC 日志 | 无 |
| 运行时 | 02-类加载机制 | 解释双亲委派,定位 ClassNotFoundException 与 NoClassDefFoundError | 01 |
| 运行时 | 05-HashMap与ConcurrentHashMap | 解释树化条件、扩容迁移和 CHM 的并发写入路径 | 01 |
| 并发 | 03-并发编程-AQS与锁 | 画出 AQS 的等待队列,正确使用 ReentrantLock 与条件队列 | 02 |
| 并发 | 04-线程池原理与调优 | 推导 execute 的分支,给队列和拒绝策略定边界 | 03 |
| 并发 | 08-JMM内存模型 | 用 happens-before 解释可见性,写对双重检查锁 | 03 |
| IO 与框架基础 | 06-IO与NIO | 区分 BIO、NIO、多路复用和零拷贝的边界 | 01 |
| IO 与框架基础 | 07-反射注解泛型与SPI | 用反射读注解、用 ServiceLoader 做服务发现 | 02 |
| IO 与框架基础 | 10-Attach机制与运行时注入 | 用 jcmd 和 Attach API 给运行中的 JVM 加载 agent | 02、07 |
| IO 与框架基础 | 11-动态代理与CGLIB | 判断 JDK 代理和 CGLIB 各自能代理什么 | 07 |
| 现代 Java | 09-Java新特性8-21 | 按版本判断哪些特性可以进生产 | 03、04 |
| 现代 Java | 12-GraalVM原生编译 | 构建 native image,处理反射与资源注册 | 01、09 |
| 现代 Java | 13-Reactor响应式编程 | 写最小 Flux/Mono 管道,解释背压和线程切换 | 04、06 |
| 现代 Java | 14-Java流式输出与SSE | 用 SseEmitter / WebFlux 输出 token,处理断连和代理超时 | 04、13 |
| 现代 Java | 15-SSE父子流与流编排 | 合并多模型/多分片输出,处理子流失败、取消链和慢客户端 | 14、13 |
| 运行时增强 | 16-Java Agent与字节码增强 | 用 premain/agentmain 挂载 agent,按方法注入探针 | 02、07、10 |
| 运行时增强 | 17-代码覆盖率采集原理 | 解释探针怎么插、行/分支覆盖率怎么算、增量覆盖率怎么落地 | 16 |
四条阅读路径
- 排障优先:01 → 04 → 05 → 03。先能看内存、线程池和锁,再补类加载与 IO。
- 框架底层:02 → 07 → 11 → 10。沿「类怎么进来 → 怎么读元数据 → 怎么增强 → 怎么在运行时挂载」走。
- 新项目选型:09 → 04 → 13 → 12。先确认语言版本,再决定线程模型和交付形态。
- AI 流式输出:14 → 15 → 13 → 04。先看 HTTP 帧和断连,再看父子流编排,最后看背压和线程池隔离。
读法约定
- 每篇先读「一句话」和「边界」,判断是否与当前问题相关,再进核心机制。
- 命令默认在 Linux/macOS 的 bash 下执行;Windows 路径和换行差异在篇内单独说明。
- 示例默认 JDK 17 或 JDK 21,涉及旧版本时会标注 JDK 8 等前提。
- 代码块只保留关键分支,能直接编译的会给出
javac/java命令。 - 版本、默认值以文中标注为准;没有把握的数字会写「以官方文档为准」。
- 交叉链接只指向本目录或已存在的相邻专题,发现失效链接先修索引再改正文。
与其他目录的关系
- Spring 的 IoC/AOP、事务和 Boot 自动装配在 26_Spring,本目录只讲它依赖的 Java 机制。
- Netty 的 Reactor 线程模型和零拷贝在 23_Netty,本目录的 06-IO与NIO 只打基础。
- MyBatis 的 JDK 动态代理在 24_MyBatis,代理本身的原理见 11-动态代理与CGLIB。
环境核对
bash
java -version
javac -version
jcmd -l # 能列出本机 Java 进程,后面的排障命令才有对象适用 JDK 17 / JDK 21 | 初稿 2026-10