跳到主要内容

系列导读:把 Java 接回计算机基础

Java 的「运行时」比 Python 更显式:JVM 规范、字节码、类加载、GC、JIT 都是可以单独拿出来讲的一层。学 Java 如果只停在 Spring 和 API,很多问题就只能靠背——为什么 HashMap 扩容是 2 倍、为什么 21–23 的虚拟线程怕 synchronized、为什么 @Transactional 自己调自己失效、为什么 Full GC 后 RSS 还不降。

这个系列想做什么​

和 Python 与计算机基础 同一套骨架:

计算机基础概念
↓
JVM / JDK 怎么实现
↓
Spring / 中间件 / 业务代码里怎么用
↓
常见坑与边界
↓
动手实验

每篇回答三个问题:

  1. 这个概念在 Java/JVM 里对应什么?
  2. JDK 的实现和教材里的理想模型差在哪?
  3. 写业务代码时,这个差异会以什么形式咬你?

文章列表​

文章核心问题对应课程
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 导致的 pinning21–23 存在;24 起 JEP 491 改善
分代 ZGC21 需 -XX:+ZGenerational;23 起默认
ScopedValue21 预览;25 转正(JEP 506)
Foreign Function & Memory API22 正式(JEP 454)
默认 GCG1(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 起改善。
加载评论中...