Java 线程池与内存管理 — 知识地图

本笔记为 MOC(Map of Content)

这是 Java 并发编程中线程池与内存管理主题的入口。点击下方链接跳转到对应的原子笔记。


🧱 基础概念

笔记简介
进程线程协程进程、线程、协程的定义、特性对比与应用场景选型

⚙️ 线程池核心

笔记简介
ThreadPoolExecutor核心参数七大构造参数详解、工作流程、工作队列类型与风险
线程池拒绝策略AbortPolicy / CallerRunsPolicy / DiscardPolicy / DiscardOldestPolicy 详解与选型
Java线程池创建方式Executors 工厂方法的陷阱、手动创建推荐配置、线程数公式、门店销售实战案例
Java虚拟线程JDK 21+ Project Loom 虚拟线程的原理、使用方式、与平台线程对比

📊 运维与调优

笔记简介
线程池监控与调优监控指标、动态参数调整、告警阈值建议

🧩 并行模式

笔记简介
MapReduce并行模式分治法(Map-Reduce)的原理、实现示例、与虚拟线程的结合

🛡️ 内存管理

笔记简介
JVM内存溢出预防OOM 类型、线程池相关预防、流式查询与分页优化、JVM 参数配置

关键联系:线程池的本质

线程池本质上是对线程生命周期的管理工具 —— 既然线程创建/销毁开销大(因涉及内核态系统调用),通过池化复用线程来减少开销。

任务提交 → [有界队列] → [最大线程限制] → [拒绝策略]
              ▼              ▼              ▼
         防队列无限增长    防线程过多      最后的保护

协程的出现进一步挑战了线程池的必要性

  • 线程池 = 复用 OS 线程,限制并发数
  • 虚拟线程(JDK 21+)= 每个任务一个虚拟线程,无需池化,创建即用

选型指南

线程池选型

场景推荐配置说明
CPU 密集型计算核心线程数 = CPU 核心数 + 1减少线程切换开销
I/O 密集型操作核心线程数 = CPU 核心数 × 2充分利用 CPU 等待时间
批量数据处理有界队列 + CallerRunsPolicy防止 OOM,允许降级
实时任务处理SynchronousQueue + 足够最大线程数低延迟,快速响应
高并发 I/O(JDK 21+)虚拟线程Java虚拟线程每个任务一个虚拟线程

瑞幸场景最佳实践

场景推荐方案参考笔记
每日批量计算固定大小线程池 + 分页查询 + Map-ReduceJava线程池创建方式MapReduce并行模式
实时订单处理有界队列线程池 + CallerRunsPolicyThreadPoolExecutor核心参数
异步任务处理CompletableFuture + 自定义线程池Java线程池创建方式

防 OOM Checklist

  • 使用有界队列(设置合理容量)
  • 避免使用 Executors.newCachedThreadPool()
  • 数据库查询使用分页 / 流式读取
  • 设置合理的 maximumPoolSize
  • 配置合理的拒绝策略(线程池拒绝策略
  • 监控队列积压(线程池监控与调优
  • 设置合理的 JVM 堆内存大小
  • 配置 OOM 自动堆转储

总结:学习路径

从基础概念到高级实践,建议按以下顺序阅读:

graph LR
    A[进程线程协程] --> B[ThreadPoolExecutor<br>核心参数]
    B --> C[线程池拒绝策略]
    B --> D[Java线程池创建方式]
    D --> E[线程池监控与调优]
    D --> F[MapReduce并行模式]
    A --> G[Java虚拟线程]
    D --> H[JVM内存溢出预防]
    E --> H

面试相关

相关笔记