系列导读:把 Java 接回计算机基础
约 1052 字大约 4 分钟
系列导读:把 Java 接回计算机基础
Java 的「运行时」比 Python 更显式:JVM 规范、字节码、类加载、GC、JIT 都是可以单独拿出来讲的一层。学 Java 如果只停在 Spring 和 API,很多问题就只能靠背——为什么
HashMap扩容是 2 倍、为什么 21–23 的虚拟线程怕synchronized、为什么@Transactional自己调自己失效、为什么 Full GC 后 RSS 还不降。
这个系列想做什么
和 Python 与计算机基础 同一套骨架:
计算机基础概念
↓
JVM / JDK 怎么实现
↓
Spring / 中间件 / 业务代码里怎么用
↓
常见坑与边界
↓
动手实验每篇回答三个问题:
- 这个概念在 Java/JVM 里对应什么?
- JDK 的实现和教材里的理想模型差在哪?
- 写业务代码时,这个差异会以什么形式咬你?
文章列表
| 文章 | 核心问题 | 对应课程 |
|---|---|---|
| Java 与数据结构 | ArrayList/LinkedList/HashMap/ArrayDeque/PriorityQueue 底层是什么? | 数据结构 |
| Java 与操作系统 | 平台线程、虚拟线程、NIO、堆外内存、fd、信号在 JVM 里怎么落地? | 操作系统 |
| Java 与计算机网络 | Socket、NIO、HttpClient、TLS、Netty 之间是什么关系? | 计算机网络 |
| Java 与数据库 | JDBC、事务、连接池、索引、JPA/MyBatis 在 Spring 应用里怎么配合? | 数据库系统 |
| Java 与内存管理 | 对象布局、TLAB、分代 GC、G1/ZGC、堆外内存怎么串起来? | 操作系统 / JVM |
| Java 与编译原理 | javac 怎么生成字节码?类加载、JIT、泛型擦除、invokedynamic 是什么? | 编译原理 |
版本基线
- 语言与 API 以 Java 17 / 21 / 25 LTS 为基线;21+ 特性(虚拟线程、
ScopedValue)和 22+ 特性(FFM)会在文中单独标注最低版本。 - JVM 行为以 HotSpot 为准;OpenJ9、GraalVM 的默认 GC/JIT 策略不同。
- GC、JIT、类文件格式都随版本演进;具体参数和日志格式以你使用的 JDK 为准。
javap的输出会随编译器版本变化,示例只保证语义,不保证每条指令的编号一致。
容易写死的版本结论
| 结论 | 生效版本 |
|---|---|
| 虚拟线程 | 21 正式(JEP 444) |
synchronized 导致的 pinning | 21–23 存在;24 起 JEP 491 改善 |
| 分代 ZGC | 21 需 -XX:+ZGenerational;23 起默认 |
ScopedValue | 21 预览;25 转正(JEP 506) |
| Foreign Function & Memory API | 22 正式(JEP 454) |
| 默认 GC | G1(JDK 9+) |
怎么读
- 每篇独立,可以按需跳读;侧边栏顺序是「数据结构 → 操作系统 → 网络 → 数据库 → 内存管理 → 编译原理」。
- 代码默认是普通 Java(无框架);Spring、MyBatis、Netty 只作为应用场景出现。带
...或未定义类型的片段会标「伪代码」,完整示例可直接编译。 - 每篇末尾的「动手实验」建议跑一遍,尤其是
javap、jcmd、jstack、-Xlog:gc这类能直接看到 JVM 行为的命令。实验环境默认是 JDK 21;数据库实验需要 H2 驱动(文中有 Maven 坐标)。 - 和仓库里的 Java 基础 互补:那是自动同步的速查笔记(可能过时),这个系列讲语法下面的运行时。
和 Python 系列的关系
- Python 版偏「解释器 + 私有堆 + GIL」;Java 版偏「JVM + 字节码 + GC + JIT」。
- 两套系列可以对照读:同样是哈希表,Python 的
dict是紧凑哈希表,Java 的HashMap是桶数组 + 链表/红黑树。 - 并发对比要加限定:CPython 默认构建同一时刻只有一个线程执行字节码,C 扩展可释放 GIL,3.13+ 另有 free-threaded 构建;Java 平台线程 1:1 映射 OS 线程,多核上可真正并行,但并行度受核数与锁竞争限制;虚拟线程由 JVM 调度到载体线程,21–23 在
synchronized中阻塞会 pin,24 起改善。