JVM之Class文件结构 Class 文件结构Class 文件是 Java 跨平台的核心,它是二进制字节流格式,与操作系统、硬件无关,JVM 只识别 Class 文件,不直接识别 Java 源码。 一、Class 文件本质 一组以8 位字节为基础的二进制流 由 JVM 规范严格定义,所有 Java 编译器(javac、kotlinc 等)都必须遵守 结构固定、紧凑、无任何分隔符 二、完整结构(固定顺序)Class 文件 2026-04-17 jvm #jvm
JVM基础概念 JVM学习路线1. JVM 基础概念 JVM、JRE、JDK 的区别与联系 JVM 跨平台原理(一次编译、到处运行) HotSpot VM 主流地位与其他 VM(OpenJ9、Zing)简介 2. 运行时数据区 线程私有区域: 程序计数器、虚拟机栈、本地方法栈 栈帧结构(局部变量表、操作数栈、动态链接、方法出口) StackOverflowError 触发场景 线程共享区域: Java 堆、 2026-04-17 jvm #jvm
高并发问题与排查 一、常见高并发底层问题1. 锁竞争 & 上下文切换(1)锁竞争 现象:大量线程争抢同一把锁,大量 BLOCKED 线程,请求排队、接口 rt 飙升、吞吐量下降。 原因: synchronized / ReentrantLock 锁粒度过大 共享变量无脑加锁,串行化严重 全局唯一大锁,并发退化串行 后果:锁等待耗时、服务吞吐上不去、高峰期雪崩。 (2)上下文切换CPU 线程来 2026-04-16 java并发 #java并发
CompletableFuture异步编程 一、核心定位CompletableFuture = JDK8 全新异步非阻塞编程工具 替代 Future + 线程池 老旧写法 支持链式回调、任务串行 / 并行组合、异常自动传递 不用手动写回调嵌套,解决回调地狱 默认用 ForkJoinPool 公共线程池,也可自定义指定线程池 二、异步任务创建与执行1. 常用创建方法12345// 无返回值 异步执行Completab 2026-04-16 java并发 #java并发
并发集合 一、ConcurrentHashMap 1.7 vs 1.81. JDK 1.7 :分段锁(Segment) 结构:Segment 数组 + HashEntry 数组 + 链表 锁设计: 把 Map 分成 16 个 Segment 每个 Segment 是一把独立的 ReentrantLock 不同 Segment 可以并发读写 核心:分段加锁,减小锁粒度,提高并发度 缺点: 结构复杂 链表查 2026-04-16 java并发 #java并发
线程池ThreadPoolExecutor 一、七大核心参数123456789public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲线程存活时间 TimeUnit unit, // 时间单 2026-04-16 java并发 #java并发
阻塞队列BlockingQueue 一、BlockingQueue 是什么?自带阻塞功能的线程安全队列 队空:取数据的线程会阻塞等待 队满:放数据的线程会阻塞等待 天然实现生产者 - 消费者模型,完全不用写 wait/notify 核心方法(必须记住): put(e):队满则阻塞 take():队空则阻塞 offer(e) / poll():不阻塞,返回布尔 /null 二、四大常用阻塞队列( 2026-04-16 java并发 #java并发
ThreadLocal 一、ThreadLocal 核心作用线程本地变量: 每个线程独有一份变量副本,线程之间完全隔离、互不干扰; 用来避免多线程共享变量竞争,代替加锁,提升并发效率。 二、实现原理1. 核心归属关系每个 Thread 对象 内部,自带一个: 1ThreadLocal.ThreadLocalMap threadLocals; 不是 ThreadLocal 存数据 数据存在当前线程自己的 Thread 2026-04-16 java并发 #java并发
AQS同步工具类 1. CountDownLatch 计数器作用让一个线程等待其他 N 个线程全部执行完,再继续运行。 一次性门栓,用完就废,不能重置。 核心原理 基于 AQS 共享模式 初始化传入 count 每次 countDown() → count -1 await() 会阻塞,直到 count = 0 典型场景 主线程等待多个子线程初始化完成 分布式接口:等待多个下游调用全部返回 代码示例1 2026-04-16 java并发 #java并发
并发安全问题(死锁) 一、死锁1. 死锁定义多个线程互相持有对方需要的锁,又都不释放自己的锁, 互相无限等待,程序彻底卡死、无法继续执行。 2. 死锁四个必要条件(缺一不可) 互斥条件 资源是独占的,同一时刻只能被一个线程持有。 请求与保持 线程已经持有一把锁,不释放旧锁,又去申请新锁。 不可剥夺 锁只能自己主动释放,不能被其他线程强行抢走。 循环等待 线程之间形成环路锁依赖:T1 等 T2 的锁,T2 等 T1 2026-04-16 java并发 #java并发