课程前言
课程定位 :区别于零基础通识课,完全面向 Java 后端中高级、资深工程师、大厂社招/校招核心面试。所有知识点不孤立讲底层,全部联动 Java、JVM、并发、Netty、中间件、线上调优、生产故障。
课程结构:五大模块、循序渐进、从通识底层 → 工程落地 → 资深内核进阶
每节统一学习模板(全书通用)
-
核心定义:一句话精准概括
-
底层原理:逐层拆解机制
-
特点/对比/优劣:面试最爱考对比题
-
面试&生产落地:标准答案 + 线上问题 + 优化方案
学习收益:彻底告别碎片化八股,建立「计算机底层 → Java源码 → 中间件 → 线上调优」完整知识链路。
模块一:计算机网络(Java 网络编程 / Netty / 网关核心基石·资深完整版)
模块前言:中级与资深网络知识分水岭
中级开发只会背诵三次握手、四次挥手;资深Java工程师核心能力 :打通「操作系统IO模型 → 内核网络协议栈 → Java NIO → Netty高性能通信 → 线上网络故障排查」全链路,能够解释Netty底层为什么快、TCP线上各种异常根因、分布式超时/重传/连接泄露问题、网关负载均衡底层逻辑。本模块补全市面90%教程缺失的Java工程落地网络底层,完全对标大厂资深面试+生产故障调优。
第1章 网络五层模型与各层核心协议(Java工程视角)
1. 核心定义
互联网数据传输遵循分层架构,业内通用TCP/IP五层模型 ,从上至下逐层封装、逐层解封装,实现跨设备、跨网络数据通信。分层的核心价值是解耦、各司其职、协议标准化、便于排错与扩展。
2. 底层原理
数据发送:应用层数据 → 传输层加端口头 → 网络层加IP头 → 数据链路层加MAC头 → 物理层二进制传输。
数据接收:反向逐层解包,剥离对应层头部,校验无误后最终交付应用程序。每层只处理自己层级的头部信息,不干预上层业务数据。
3. 各层核心职责与协议(Java重点标注)
-
应用层 :面向用户/应用程序,定义业务数据格式与交互规则。协议:HTTP、HTTPS、DNS、FTP、SSH、RPC自定义协议。Java Netty、自定义RPC、网关均工作在应用层。
-
传输层 :端到端通信,进程与进程的数据传输、流量控制、可靠保障。协议:TCP、UDP。Java NIO、Socket通信底层依赖传输层。
-
网络层:主机到主机寻址、路由转发、跨网段传输。协议:IP、ICMP、ARP。负责找到目标服务器。
-
数据链路层:局域网内帧传输、MAC寻址、差错校验、帧同步。
-
物理层:二进制比特流传输,定义硬件电气、光学传输标准,处理物理链路通断。
4. 面试&生产落地
-
为什么需要分层?解耦、各司其职、单层改动不影响全局,迭代维护简单,故障可分层定位。
-
Java NIO、Netty 工作在传输层+应用层,基于操作系统内核网络IO模型实现高并发通信。
-
线上网络故障标准分层排查:物理链路 → 局域网互通 → 路由转发 → 端口连通/防火墙 → 应用协议异常。
-
RPC框架、网关、MQ通信底层全部依赖五层模型的传输层可靠机制实现数据投递。
第2章 TCP 完整核心原理(资深高频重中之重·补全完整版)
1. 核心定义
TCP 是面向连接、可靠、字节流、全双工、拥塞可控的传输层协议,是互联网绝大多数业务、Java网络通信、分布式调用的底层核心协议。
2. 核心机制原理
(1)三次握手(建立连接)深层原理
第一次握手:客户端发送 SYN 报文,携带客户端初始序列号ISN,请求建立连接;服务端接收,确认客户端发送能力正常。
第二次握手:服务端返回 SYN+ACK 报文,携带服务端ISN,确认客户端、告知客户端自己收发能力正常。
第三次握手:客户端返回 ACK 报文,确认服务端接收能力正常,双方同步序列号,连接正式建立。
核心目的(面试必背):同步双方初始序列号、确认双向收发能力正常、规避历史失效报文残留、防止过期连接干扰新连接。
(2)四次挥手(断开连接)深层原理
TCP 全双工通信,读写通道完全独立,单方向关闭不影响另一方向数据传输,因此必须四次交互。
主动方发 FIN(关闭己方写通道)→ 被动方 ACK 确认 → 被动方数据发完发 FIN → 主动方 ACK 确认,等待2MSL后连接彻底断开。
核心本质:FIN只关闭单向流,保证对方残留数据可以正常接收完毕,避免数据丢失。
(3)四大可靠传输机制(完整补全)
-
确认应答ACK:每段数据接收成功必须返回ACK确认,携带期望接收的下一个字节序号,保证数据可达、有序。
-
超时重传:报文丢失或ACK超时,自动重传,解决网络丢包、延迟问题,保障可靠性。
-
滑动窗口(流量控制):动态调整发送速率,匹配接收方缓冲区剩余容量,防止接收方缓冲区溢出、数据丢失。
-
拥塞控制 :根据全网拥堵状态调整发送速率,避免网络雪崩,包含慢启动、拥塞避免、快重传、快恢复四阶段。
(4)保活机制 Keep-Alive
连接空闲一段时间后,自动发送探测报文,检测对端状态,清理宕机、断网、异常退出导致的僵尸连接,释放无效文件句柄。
(5)TCP序列号与确认号(有序性核心)
TCP每个字节数据都有唯一序列号,用于排序、去重、标记数据位置;确认号保证数据按序接收、无重复、无遗漏,是TCP可靠有序的底层基石。
3. TCP 核心缺陷与特性对比
-
优点:可靠、有序、无丢失、无重复、支持流量/拥塞控制、适配复杂网络。
-
缺点:头部开销大、握手挥手耗时、系统资源占用高、不适用于超低延迟弱网场景。
4. 面试&生产高频问题(资深完整版)
(1)TIME_WAIT 详解(生产重点)
产生:主动关闭连接方,四次挥手最后一步进入 TIME_WAIT,持续固定 2MSL。
作用:保证对方收到最后ACK报文、隔离新旧连接重复报文、保证网络残留数据传输完毕。
生产问题:高并发短连接场景大量 TIME_WAIT 堆积,耗尽本机端口资源,导致服务无法新建连接。
优化:开启 tcp_tw_reuse、扩容本地端口范围、合理缩短超时时间、业务层连接池复用连接。
(2)CLOSE_WAIT 详解(Java代码Bug核心)
产生:被动关闭方收到FIN报文后,应用层未调用 close() 关闭连接、未释放资源。
本质:Java代码连接泄露Bug,流未关闭、连接未回收。
后果:文件句柄持续占用、句柄耗尽、服务拒绝新连接、端口资源泄露。
解决:try-with-resources自动关闭流、统一资源关闭工具类、连接池规范回收连接。
(3)粘包拆包(Netty核心考点)
原因:TCP 是无边界字节流协议,内核缓冲区会合并小数据包、拆分大数据包,导致应用层读取数据错乱。
四大解决方案:固定长度报文、特殊分隔符、报文头+长度字段(工业主流)、Netty专用解码器(LengthFieldBasedFrameDecoder)。
(4)TCP半开连接/半关闭连接
半关闭:一方关闭写通道、仍可接收数据;半开连接:对方异常宕机断网,本地连接仍存活,形成僵尸连接,占用句柄资源,依赖Keep-Alive机制清理。
第3章 UDP 核心原理与适用场景(Java高阶补充)
1. 核心定义
UDP 是无连接、不可靠、面向数据报、独立报文边界的传输层协议,无需握手,直接收发数据,极致低延迟。
2. 底层原理
无需建立连接、无ACK确认、无拥塞/流量控制、无状态,每次发送独立数据报,内核不缓存报文状态,传输效率拉满。
3. 优缺点对比
优点:延迟极低、开销小、适合海量并发、支持多播广播、内核开销极小。
缺点:可能丢包、乱序、无重传机制、数据不可靠、无拥塞控制易导致网络风暴。
4. 生产&Java落地场景
直播、语音视频、游戏实时交互、DNS查询、监控指标上报、QUIC协议底层、UDP自定义可靠传输框架。
资深拓展:业务可基于UDP自研可靠机制(重传、序号、ACK),兼顾低延迟与可靠性,适配实时业务。
第4章 HTTP/HTTPS 全版本演进与核心机制(网关/接口核心)
1. HTTP 各版本核心差异(面试必考完整版)
-
HTTP1.0:默认短连接,一次请求一次连接,频繁握手挥手,性能极差,无连接复用。
-
HTTP1.1 :默认长连接Keep-Alive、支持缓存、断点续传、Host头、请求管线化;存在串行队头阻塞,一个请求阻塞后续全部请求。
-
HTTP2.0:二进制帧传输、单连接多路复用、头部压缩、服务端推送、流量控制,彻底解决1.1队头阻塞,基于TCP。
-
HTTP3.0(QUIC):基于UDP,0-RTT快速握手、弱网容错、连接迁移、彻底无队头阻塞,移动端、高抖动网络首选。
2. HTTPS 安全机制(补全TLS底层)
(1)核心定义
HTTPS = HTTP + SSL/TLS 安全加密层,443端口,实现传输数据加密、防篡改、防劫持、身份校验。
(2)混合加密完整原理
混合加密机制:非对称加密协商会话密钥 + 对称加密传输业务数据 + 数字签名校验完整性与身份,兼顾安全性与传输性能。
(3)TLS版本差异与优化
TLS1.2:四次握手,流程繁琐、延迟高;TLS1.3:精简为两次握手,删除冗余步骤,大幅提升连接速度、降低延迟,生产主流推荐。
3. HTTP 缓存机制(业务优化核心)
-
强缓存:Cache-Control、Expires,不请求服务器,直接复用本地缓存,性能最优。
-
协商缓存:Last-Modified、ETag,请求服务器校验资源是否更新,未更新则304复用缓存,更新则返回新资源。
4. 网络安全基础(生产必备)
-
CORS跨域:浏览器同源策略限制,协议/域名/端口任一不同即跨域,服务端配置响应头解决,前后端分离核心机制。
-
XSS:跨站脚本攻击,注入恶意脚本,防护:输入过滤、输出转义、CSP策略、HttpOnly Cookie。
-
CSRF:跨站请求伪造,盗用用户身份请求,防护:Token校验、Referer校验、SameSite Cookie。
第5章 DNS 域名解析原理与生产优化
1. 核心定义
DNS 是域名解析协议,实现人类可读域名与机器可读IP地址的双向映射,是所有外网访问的前置环节。
2. 完整解析流程
浏览器缓存 → 系统缓存 → 本地DNS服务器 → 根域名服务器 → 顶级域名服务器 → 权威域名服务器 → 返回IP并缓存。
3. 查询方式
-
递归查询:本地DNS替客户端完成全部查询,返回最终结果。
-
迭代查询:各级服务器逐级返回下一级地址,由本地DNS继续查询,分担根服务器压力。
4. 生产优化方案
DNS缓存、预解析、CDN加速、智能DNS调度、本地DNS集群,降低解析延迟、解决DNS解析超时导致的接口失败问题。
第6章 负载均衡与代理网关(架构必备完整版)
1. 四层负载均衡(LVS)
工作在传输层,基于 IP+端口 转发,不解析应用层协议,无业务侵入、性能极高、吞吐量大,适合全局流量入口、高并发场景。
2. 七层负载均衡(Nginx/网关)
工作在应用层,解析HTTP/HTTPS协议,支持路由匹配、权重分发、灰度发布、限流、缓存、rewrite重写、日志统计,业务灵活性极强,Java微服务网关底层依赖七层负载。
3. 核心调度算法
轮询、加权轮询、IP哈希(会话保持)、最小连接数、最快响应优先、一致性哈希。
4. 正向代理 & 反向代理
-
正向代理:代理客户端,隐藏客户端真实IP(翻墙、内网代理上网)。
-
反向代理:代理服务端,隐藏后端服务集群,对外统一入口(微服务网关、Nginx生产主流)。
5. 高可用机制
主动/被动健康检查、故障节点自动摘除、主备切换、集群容灾、异地多活流量调度、熔断降级联动。
第7章 Java网络编程核心(BIO/NIO/AIO 资深分水岭)
1. 核心定义
Java网络通信基于操作系统Socket套接字实现,分为BIO、NIO、AIO三种编程模型,模型差异直接决定并发能力,Netty基于NIO优化封装。
2. BIO 阻塞IO模型(老式)
同步阻塞,一连接一线程,线程阻塞等待数据就绪与拷贝;优点编码简单,缺点线程资源爆炸、并发极低、无法应对高连接场景,生产已淘汰。
3. NIO 非阻塞IO(Java核心·Netty底层)
同步非阻塞,基于缓冲区Buffer、通道Channel、选择器Selector实现;单线程可监听成千上万个连接,无连接阻塞,仅处理就绪事件,高并发高性能,是Java网络编程主流。
核心三组件:Buffer缓冲区、Channel通道、Selector多路复用器。
4. AIO 异步IO
异步非阻塞,内核完成数据拷贝后主动回调应用程序,无需线程轮询;Java落地场景少、适配差,Netty未采用。
5. 面试&生产落地
Netty彻底重构JDK NIO缺陷,解决空轮询Bug、API繁琐、线程模型简陋问题,实现主从Reactor多线程模型,支撑高性能RPC、网关、IM通信。
第8章 线上网络高频故障全解(资深排错必备)
1. 接口超时根因
网络丢包重传、TCP队列溢出、连接泄露、线程阻塞、GC卡顿、后端慢SQL、网络拥堵。
2. 端口占用/无法建连
端口被占用、防火墙拦截、内核连接队列满、文件句柄耗尽、IP白名单限制。
3. 数据错乱/重复请求
TCP粘包拆包、网络重传、幂等未实现、超时重试导致重复调用。
4. 长连接断线/心跳失效
防火墙空闲断开、Keep-Alive参数不合理、网络抖动、服务宕机未释放连接。
第9章 资深网络核心思维总结
-
所有分布式调用超时、抖动、失败,底层90%都是网络层问题(丢包、重传、连接异常、队列满)。
-
Netty高性能本质:IO多路复用 + 线程模型优化 + 内存池 + 拆包粘包处理 + 无锁设计。
-
TCP可靠是内核兜底可靠,业务仍需做重试、幂等、超时控制,双重保障。
-
线上网络调优核心:优化内核网络参数、规避连接堆积、减少上下文切换、合理复用连接。
计算机简洁版
第1章 网络五层模型与各层核心协议
1. 核心定义
互联网数据传输遵循分层架构,业内通用TCP/IP五层模型,从上至下逐层封装、逐层解封装,实现跨设备、跨网络数据通信。
2. 底层原理
数据发送:应用层数据 → 传输层加端口头 → 网络层加IP头 → 数据链路层加MAC头 → 物理层二进制传输。
数据接收:反向逐层解包,剥离对应层头部,最终交付应用程序。
3. 各层核心职责与协议
-
应用层:面向用户/应用程序,定义业务数据格式。协议:HTTP、HTTPS、DNS、FTP、SSH。
-
传输层:端到端通信,进程与进程的数据传输。协议:TCP、UDP。
-
网络层:主机到主机寻址、路由转发。协议:IP、ICMP、ARP。
-
数据链路层:局域网内帧传输、MAC寻址、差错校验。
-
物理层:二进制比特流传输,定义硬件电气、光学传输标准。
4. 面试&生产落地
-
为什么需要分层?解耦、各司其职、单层改动不影响全局,便于迭代和排错。
-
Java NIO、Netty 工作在传输层+应用层,基于操作系统内核网络能力实现高并发通信。
-
线上网络故障可分层排查:物理链路 → 局域网 → 路由 → 端口连通 → 应用协议。
第2章 TCP 完整核心原理(资深高频重中之重)
1. 核心定义
TCP 是面向连接、可靠、字节流、全双工的传输层协议,是互联网绝大多数业务的底层通信协议。
2. 核心机制原理
(1)三次握手(建立连接)
第一次握手:客户端发送 SYN 报文,请求建立连接;服务端接收,确认客户端发送能力正常。
第二次握手:服务端返回 SYN+ACK 报文,确认客户端、告知客户端自己收发能力正常。
第三次握手:客户端返回 ACK 报文,确认服务端接收能力正常,连接正式建立。
核心目的:同步双方初始序列号、确认双向收发能力正常、规避历史失效报文干扰。
(2)四次挥手(断开连接)
TCP 全双工通信,读写通道独立,无法一次性关闭,必须四次交互。
主动方发 FIN(关闭写通道)→ 被动方 ACK 确认 → 被动方数据发完发 FIN → 主动方 ACK 确认,连接彻底断开。
(3)四大可靠传输机制
-
确认应答:每段数据接收成功必须返回 ACK 确认,保证数据可达。
-
超时重传:报文丢失或ACK超时,自动重传,解决网络丢包问题。
-
滑动窗口(流量控制):动态调整发送速率,匹配接收方缓冲区上限,防止接收方溢出。
-
拥塞控制:根据网络拥堵状态调整发送速率,避免全网拥塞,包含慢启动、拥塞避免、快重传、快恢复。
(4)保活机制 Keep-Alive
连接空闲一段时间后,自动发送探测报文,检测对端状态,清理宕机、断网导致的僵尸连接。
3. TCP 核心缺陷与特性对比
-
优点:可靠、有序、无丢失、无重复。
-
缺点:开销大、握手挥手耗时、头部占用高、不适合极速弱网场景。
4. 面试&生产高频问题(必背)
(1)TIME_WAIT 详解
产生:主动关闭连接方,四次挥手最后一步进入 TIME_WAIT,持续 2MSL。
作用:保证对方收到最后ACK、隔离新旧连接重复报文。
生产问题:高并发短连接场景大量 TIME_WAIT 会耗尽端口资源。
优化:开启 tcp_tw_reuse、调整端口范围、缩短超时时间。
(2)CLOSE_WAIT 详解
产生:被动关闭方收到FIN后,应用层未调用 close() 关闭连接。
本质:代码Bug,连接泄露,不释放文件句柄。
后果:文件句柄耗尽、服务无法建立新连接、端口占用。
解决:排查代码未关闭流/连接、统一资源关闭工具类。
(3)粘包拆包
原因:TCP 是字节流协议,无数据边界,内核缓冲区会合并/拆分数据。
解决方案:固定长度报文、特殊分隔符、报文头+报文体(长度字段)、Netty 解码器(LengthFieldBasedFrameDecoder)。
第3章 UDP 核心原理与适用场景
1. 核心定义
UDP 是无连接、不可靠、面向数据报的传输层协议,无需握手,直接收发数据。
2. 底层原理
无需建立连接、无需确认应答、无拥塞控制、无流量控制,每次发送独立数据报,传输效率极致高。
3. 优缺点对比
优点:延迟极低、开销小、适合海量并发、支持多播广播。
缺点:可能丢包、乱序、无重传机制、数据不可靠。
4. 生产场景
直播、语音视频、游戏、DNS查询、监控上报、QUIC协议底层。
第4章 HTTP/HTTPS 全版本演进与核心机制
1. HTTP 各版本核心差异(面试必考)
-
HTTP1.0:默认短连接,一次请求一次连接,频繁握手,性能极差。
-
HTTP1.1:默认长连接、支持缓存、断点续传、Host头、管线化;存在队头阻塞问题。
-
HTTP2.0:二进制帧传输、单连接多路复用、头部压缩、服务端推送,解决1.1队头阻塞。
-
HTTP3.0(QUIC):基于UDP,0-RTT快速握手、弱网容错、彻底无队头阻塞,移动端首选。
2. HTTPS 安全机制
(1)核心定义
HTTPS = HTTP + SSL/TLS 安全加密层,443端口,实现传输数据加密、防篡改、防劫持。
(2)加密原理
混合加密机制:非对称加密协商会话密钥 + 对称加密传输业务数据 + 数字签名校验完整性。
(3)TLS版本差异
TLS1.2:四次握手,流程繁琐;TLS1.3:精简为两次握手,大幅提升连接速度。
3. HTTP 缓存机制(业务优化核心)
-
强缓存:Cache-Control、Expires,不请求服务器,直接复用本地缓存。
-
协商缓存:Last-Modified、ETag,请求服务器校验资源是否更新,未更新则304复用缓存。
4. 网络安全基础
-
CORS跨域:浏览器同源策略限制,协议/域名/端口任一不同即跨域,服务端配置响应头解决。
-
XSS:跨站脚本攻击,注入恶意脚本,防护:输入过滤、输出转义、CSP策略。
-
CSRF:跨站请求伪造,盗用用户身份请求,防护:Token校验、Referer校验。
第5章 DNS 域名解析原理
1. 核心定义
DNS 是域名解析协议,实现人类可读域名与机器可读IP地址的双向映射。
2. 解析流程
浏览器缓存 → 系统缓存 → 本地DNS服务器 → 根域名服务器 → 顶级域名服务器 → 权威域名服务器 → 返回IP。
3. 查询方式
-
递归查询:本地DNS替客户端完成全部查询。
-
迭代查询:各级服务器逐级返回下一级地址,由本地DNS继续查询。
4. 生产优化
DNS缓存、预解析、CDN加速、智能DNS调度,降低解析延迟。
第6章 负载均衡与代理网关(架构必备)
1. 四层负载均衡(LVS)
工作在传输层,基于 IP+端口 转发,不解析应用层协议,性能极高、无业务侵入,适合高并发流量入口。
2. 七层负载均衡(Nginx)
工作在应用层,解析HTTP/HTTPS协议,支持路由匹配、权重分发、灰度发布、限流、缓存、rewrite重写,业务灵活性极强。
3. 核心调度算法
轮询、加权轮询、IP哈希(会话保持)、最小连接数、最快响应优先。
4. 正向代理 & 反向代理
-
正向代理:代理客户端,隐藏客户端真实IP(翻墙)。
-
反向代理:代理服务端,隐藏后端服务集群,对外统一入口(生产主流)。
5. 高可用机制
主动/被动健康检查、故障节点自动摘除、主备切换、集群容灾、异地多活流量调度。
模块二:数据结构与算法(Java集合/中间件底层·资深完整版)
第1章 进程、线程、协程核心原理
1. 核心定义与本质区别
-
进程 :操作系统资源分配最小单位,拥有独立虚拟地址空间,进程间完全隔离,切换开销极大。
-
线程 :CPU调度执行最小单位,共享进程堆、方法区资源,私有栈空间,切换开销极小。
-
协程:用户态轻量级线程,无内核切换、无需OS调度、极致高并发,Java主流通过框架实现(Quasar)。
2. 用户态 & 内核态
用户态:应用程序运行态,权限受限,无法直接操作硬件和内核资源。
内核态:操作系统内核运行态,最高权限,可操作所有硬件、内存、网络资源。
核心痛点:用户态切换内核态需要上下文切换,频繁系统调用严重损耗Java服务性能。
3. 上下文切换
线程/进程切换时,CPU需要保存当前执行现场、加载新现场,产生性能开销。高并发下大量上下文切换是服务卡顿、CPU飙高的核心原因之一。
4. IPC 进程通信方式
管道、消息队列、共享内存(速度最快)、信号量、Socket(跨机器通信)。
5. 死锁原理与解决
四大必要条件:互斥条件、请求保持、不可剥夺、循环等待。
解决方案:破坏任意一个条件、锁排序、超时释放、死锁检测工具。
第2章 内存管理(JVM内存模型底层)
1. 虚拟内存机制
操作系统为每个进程分配独立虚拟内存空间,隔离进程内存,解决物理内存不足问题,实现内存复用。
2. 分页、缺页中断、内存碎片
虚拟内存分页映射物理内存页框,访问未加载内存触发缺页中断,从磁盘加载数据。
内存碎片分为内部碎片(页内剩余空间)、外部碎片(空闲小块内存),会降低内存利用率。
3. Swap 与 OOM Killer
Swap交换分区:物理内存不足时,将冷数据置换到磁盘,频繁Swap会导致服务严重卡顿。
OOM Killer:系统内存耗尽时,内核强制杀死内存占用最大的进程,是线上服务挂掉的常见原因。
4. 写时复制 COW
fork创建子进程时,不立刻复制父进程内存,仅共享内存;当任意进程修改数据时,才复制内存副本,极大节省fork开销。
5. 页缓存与脏页
磁盘数据优先缓存到内存页缓存,提升读写速度;修改后的缓存数据为脏页,内核定时刷入磁盘,是MySQL、Redis持久化的底层核心机制。
第3章 五大IO模型(NIO/Netty底层)
1. 核心区分维度
阻塞/非阻塞 :线程是否等待数据就绪;同步/异步:数据拷贝是否由内核完成通知。
2. 五大模型详解
-
阻塞IO:线程全程阻塞等待数据就绪+拷贝,简单低效,并发能力差。
-
非阻塞IO:线程轮询检测数据状态,不阻塞,但空轮询浪费CPU资源。
-
IO多路复用:单线程监听大量文件描述符,仅处理就绪事件,高并发核心方案。
-
信号驱动IO:数据就绪内核发送信号通知线程,使用较少。
-
AIO异步IO:内核完成数据拷贝后主动通知应用,真正异步,Java落地较少。
3. select/poll/epoll 深度对比
-
select:fd数量受限、每次遍历全部fd、效率低。
-
poll:无fd上限,仍全量遍历,无本质优化。
-
epoll:事件驱动、仅遍历就绪fd、支持LT水平触发/ET边缘触发,Linux高并发标配,Netty底层依赖。
4. 零拷贝原理(生产高频优化)
核心:减少用户缓冲区与内核缓冲区之间的数据拷贝,降低CPU开销、提升传输效率。
主流实现:mmap内存映射、sendfile。
落地场景:文件上传下载、网络文件传输、Redis/RDB持久化、Nginx静态资源传输。
第4章 系统底层基础与容器原理
-
中断机制:硬中断响应硬件事件,软中断处理内核异步任务。
-
文件系统:inode存储文件元信息,block存储文件数据;软链接跨分区、硬链接不跨分区。
-
资源限制:ulimit限制文件句柄数、进程数,防止服务资源耗尽。
-
容器底层:Namespace实现进程/网络/用户隔离,Cgroup实现CPU/内存资源限制。
模块三:数据结构与算法(Java集合/中间件底层·资深完整版)
前言:本模块资深学习定位
中级开发 只会刷题、认结构;资深/大厂面试 核心考察:数据结构底层存储、时间复杂度、优缺点、适用场景、Java集合对应实现、中间件底层依托、线上性能问题。本章节补齐市面90%笔记缺失的「工程落地底层」,完全对标阿里/字节/腾讯Java资深面试标准。
第1章 算法复杂度分析(所有算法的前置基石)
1. 核心定义
复杂度是衡量算法执行效率的数学模型,分为时间复杂度 (执行次数)和空间复杂度(额外内存开销),不看绝对耗时,看数据量增长趋势。
2. 底层原理
算法执行耗时随数据量n线性/指数/对数增长,大厂只看最坏时间复杂度,同时兼顾平均复杂度;空间复杂度重点看是否产生额外数组、递归栈、辅助对象。
3. 常见复杂度排序(必背)
O(1) 常数 < O(logn) 对数 < O(n) 线性 < O(nlogn) 线性对数 < O(n²) 平方 < O(2ⁿ) 指数
4. 面试&生产落地
-
为什么HashMap查询O(1)、树结构O(logn)?哈希直接寻址优于树遍历。
-
生产禁止嵌套循环O(n²),数据量上万必卡顿,必须优化为O(n)、O(nlogn)。
-
递归算法重点关注栈空间开销,避免大数据量栈溢出。
第2章 线性数据结构(Java集合底层全覆盖)
1. 数组(ArrayList底层)
核心定义
一段连续内存空间存储相同类型数据,支持下标随机访问。
底层原理
内存地址连续,通过首地址+下标偏移量直接定位元素;Java数组固定长度,ArrayList基于动态数组实现扩容机制。
特点与优劣
-
优点:随机访问快 O(1)、CPU缓存命中率高、遍历效率极高
-
缺点:插入/删除中间元素需移动数据 O(n)、固定长度、扩容存在拷贝开销
Java&生产落地
ArrayList基于动态数组,默认初始容量10,1.5倍扩容;适合读多写少、遍历查询场景。
2. 链表(LinkedList底层)
核心定义
离散内存存储,通过节点指针关联前后元素,分为单向链表、双向链表、循环链表。
底层原理
每个节点包含数据域与指针域,无需连续内存,新增节点仅修改指针指向,无需数据迁移。
特点与优劣
-
优点:任意位置增删快 O(1)、无内存碎片、无扩容拷贝开销
-
缺点:无随机访问、查询遍历O(n)、指针占用额外内存、CPU缓存不命中
Java&生产落地
LinkedList基于双向链表,适合写多读少、频繁插入删除;栈、队列、阻塞队列底层大量依赖链表结构。
3. 栈(LIFO 后进先出)
核心定义
限制仅在一端进出的线性结构,后进先出。
底层原理
仅允许栈顶入栈、出栈操作,栈底固定,保证操作有序性。
生产&Java落地
JVM栈帧、方法调用栈、递归回溯、表达式求值、括号匹配、浏览器前进后退。
4. 队列(FIFO 先进先出)
核心定义
队尾入队、队首出队,先进先出线性结构。
进阶分类(资深必知)
-
普通队列:FIFO顺序执行
-
循环队列:解决数组队列假溢出问题(线程池任务队列底层)
-
阻塞队列:满阻塞、空阻塞(Java并发包核心)
-
优先队列:堆实现,按权重排序(ThreadPoolExecutor任务调度)
生产落地
流量削峰、任务排队、线程池、MQ消息队列、异步解耦。
第3章 哈希表结构(HashMap/HashTable/ThreadLocalMap底层)
1. 核心定义
通过哈希函数将key映射为数组下标,实现平均O(1)读写的键值对存储结构。
2. 底层原理
哈希函数扰动计算下标 → 定位数组桶位 → 无冲突直接写入 → 有冲突使用冲突解决方案。
3. 两种哈希冲突解决方案(面试必考对比)
(1)链地址法(HashMap)
桶位冲突后挂载链表,链表过长转为红黑树(JDK8);优点:冲突容忍度高、扩容平滑。
(2)开放寻址法(ThreadLocalMap)
冲突后向后寻找空桶,线性探测;优点:无指针开销、内存紧凑;缺点:冲突堆积、扩容成本高。
4. Java HashMap 资深底层考点(补全)
-
数组+链表+红黑树复合结构
-
阈值8转红黑树、阈值6退化为链表
-
默认容量16、负载因子0.75、2倍扩容
-
扰动函数减少哈希碰撞
-
线程不安全:并发插入丢失数据、死循环扩容(JDK7)
5. 生产优缺点
优点:读写极快、适合缓存、映射场景;缺点:无序、内存利用率一般、哈希冲突会退化性能。
第4章 树结构大全(MySQL/Redis/Java集合核心底层)
1. 基础二叉树、二叉搜索树BST
BST规则:左子树全部小于根、右子树全部大于根;缺点:极端场景退化为链表,查询退化为O(n),因此诞生平衡树。
2. 红黑树(Java资深重点)
核心定义
自平衡二叉搜索树,通过染色+左旋+右旋维持近似平衡,保证增删查稳定 O(logn)。
五大性质(背诵精简版)
-
- 节点红黑二色;2. 根节点黑色;3. 叶子空节点黑色;4. 红节点子节点必黑;5. 任意节点到叶子路径黑色节点数相同
落地场景
JDK8 HashMap、TreeMap、TreeSet;优势:平衡成本低、性能稳定,适合内存高频读写。
3. B+树(MySQL索引灵魂)
核心定义
多路平衡查找树,专为磁盘IO优化设计,是数据库索引专属结构。
底层特性(面试必背)
-
非叶子节点只存索引key,不存数据,节点层级极小、磁盘IO极少
-
所有数据全部落在叶子节点
-
叶子节点有序双向链表串联,支持范围查询、区间遍历
-
层高极低(千万数据层高3~4),查询稳定极快
生产落地
MySQL InnoDB 聚簇索引、二级索引全部基于B+树;解释了为什么数据库适合范围查询、排序、分页。
4. 跳表(Redis ZSet底层)
核心定义
多层有序链表,通过随机层数建立索引,实现查询 O(logn)。
对比红黑树优势
实现简单、无复杂旋转染色、支持范围遍历、内存开销可控,更适合磁盘/网络中间件,因此Redis选用跳表而非红黑树。
第5章 工程高阶数据结构(分布式/中间件专属·资深分水岭)
1. 堆&优先队列
完全二叉树实现,分为大顶堆、小顶堆;核心作用:动态获取最值。
落地:Java PriorityQueue、线程池任务优先级、TOPK问题、定时器延时任务。
2. 字典树 Trie
按字符逐层匹配的树结构,前缀匹配效率极高。
落地:网关路由匹配、搜索提示、敏感词过滤、字符串批量检索。
3. 并查集
支持快速合并集合、查询连通性,带路径压缩、按秩合并优化,近乎O(1)。
落地:区间连通、朋友圈问题、图连通性、分布式节点分组。
4. 布隆过滤器(缓存穿透解决方案)
底层原理
超大位数组+多个哈希函数,将元素映射为多个bit位标记。
核心特性(必背)
可以判断一定不存在,不能判断一定存在(存在误判、无漏判)。
生产落地
Redis前置防缓存穿透、垃圾邮件过滤、URL去重、海量数据判重。
5. 一致性哈希(分布式核心)
解决问题
普通哈希取模,节点增减会导致大量缓存失效、数据倾斜。
底层原理
0~2³²哈希环,对象哈希落点归属顺时针最近节点;新增节点仅影响局部数据。
优化机制
虚拟节点解决数据倾斜、节点负载不均问题。
落地
Redis集群、Nginx负载均衡、分布式限流、分片存储。
6. 单调栈 & 单调队列(工程高频)
维持内部元素单调递增/递减,可快速求解:左右最大值、滑动窗口最大值、接雨水、温度趋势。
落地:风控数据统计、监控指标滑动窗口计算。
第6章 经典算法详解(面试手撕+工程优化)
1. 八大排序算法(时间复杂度+稳定性+场景)
稳定排序 :冒泡、插入、归并;不稳定:选择、快排、堆排、希尔
-
冒泡/插入/选择:简单、O(n²)、仅适合小数据量
-
快速排序:分治思想、平均O(nlogn)、实际最快、不稳定
-
归并排序:稳定O(nlogn)、适合外部排序、海量数据
-
堆排序:O(nlogn)、适合TOPK场景
2. 二分查找(工程最常用)
有序数组专属、O(logn);变种:左右边界查找、旋转有序数组、局部极值查找。
生产:有序列表检索、边界匹配、二分答案解题。
3. 五大算法思想(资深必备)
-
分治:分而治之、递归合并(快排、归并、海量数据拆分)
-
贪心:每步局部最优,不一定全局最优(活动选择、区间覆盖)
-
回溯:深度优先、尝试+回退(全排列、组合、子集)
-
动态规划DP:重叠子问题+最优子结构,空间换时间(背包、最长子序列)
-
双指针/滑动窗口:子数组、子串、区间统计、最长最短问题
4. 图论基础(后端进阶)
-
存储:邻接表(工程常用)、邻接矩阵(稠密图)
-
DFS深度优先:递归/栈实现,连通性、路径搜索
-
BFS广度优先:队列实现、最短无权路径、层序遍历
-
拓扑排序:有向无环图、任务依赖排序
第7章 工业级工程算法(资深与中级分水岭)
1. 缓存淘汰算法
-
LRU:最近最少使用,LinkedHashMap底层、Redis内存淘汰
-
LFU:最少使用频次,解决LRU缓存偶用数据污染问题
2. 限流算法(线上高并发核心)
-
固定窗口计数器:简单、临界突刺问题
-
滑动窗口计数器:平滑限流、解决临界突刺
-
漏斗限流:匀速流出、削峰不控并发
-
令牌桶限流:可突发、可匀速,工程最常用(Sentinel底层)
3. 海量数据处理思路(大厂手撕)
分治拆分、哈希分片、位图统计、堆TopK、外排序、多路归并,解决亿级数据去重、排序、频次统计、最大最小值问题。
数据结构与算法简洁版
第1章 基础线性数据结构
1. 数组
连续内存空间、下标随机访问O(1)、增删需要移动元素效率低、固定长度,对应Java ArrayList底层。
2. 链表
离散内存存储、无扩容开销、增删O(1)、查询效率低,对应Java LinkedList底层。
3. 栈&队列
栈:后进先出,用于栈帧、递归、表达式解析;队列:先进先出,用于线程池、消息排队。
第2章 哈希结构与哈希冲突
哈希表通过哈希函数将key映射为下标,实现高效读写。
哈希冲突解决方案:链地址法(HashMap)、开放寻址法(ThreadLocalMap)。
第3章 树形结构(面试终极重点)
1. 红黑树
自平衡二叉搜索树,通过染色、旋转维持近似平衡,增删查稳定O(logn),是 JDK8 HashMap、TreeMap 底层。
2. B+树
多路平衡查找树,非叶子节点仅存索引、叶子节点存全部数据且有序链表串联,磁盘IO次数极少,是 MySQL 索引底层核心。
第4章 工程高阶数据结构(中间件专属)
-
跳表:多层有序链表,查询效率媲美红黑树、实现简单,Redis ZSet底层。
-
字典树Trie:前缀匹配,用于路由匹配、搜索提示、字符串检索。
-
堆/优先队列:动态获取最值,用于线程池任务调度、TOPK问题。
-
并查集:快速合并、查询集合连通关系,解决区间连通问题。
-
布隆过滤器:位图存储,判断元素一定不存在、存在误判,解决缓存穿透。
-
一致性哈希:解决分布式节点扩容缩容数据倾斜,用于分布式缓存、负载均衡。
第5章 算法体系
1. 基础必备
复杂度分析、八大排序(快排/归并/堆排重点)、二分查找。
2. 高阶思想
双指针、滑动窗口、单调栈、单调队列、递归回溯、分治、贪心、动态规划、位运算。
3. 图论基础
邻接表存储、DFS、BFS、拓扑排序、最短路径。
4. 工业级算法
LRU/LFU缓存淘汰、滑动窗口限流、漏斗限流、海量数据TopK、去重、排序。
模块四:Linux生产实战(排查+调优+运维·资深完整版)
前言:Linux模块资深学习定位
中级开发只会简单 ls、cd 命令;资深Java工程师核心能力:线上故障排查、性能瓶颈定位、内核调优、资源治理、服务高可用运维。本模块完全对标生产环境,覆盖「日常运维、性能监控、CPU/内存/IO/网络排查、内核调优、故障复盘、自动化运维」,所有知识点均联动Java服务线上问题,是大厂面试、生产调优核心考点。
第1章 Linux基础核心能力(生产必备)
1. 核心定义
Linux是后端服务标准运行系统,所有Java、中间件、分布式服务均部署在Linux环境,系统资源、内核参数直接决定服务性能与稳定性。
2. 文件体系与权限原理
Linux一切皆文件,分为普通文件、目录文件、链接文件、设备文件、管道文件;权限采用「用户+组+其他」三级权限模型,r读w写x执行权限对程序运行、日志写入、进程启动至关重要。
3. 高频生产命令(分类完整版)
-
文件操作:ls、cd、pwd、mkdir、rm、cp、mv、touch、stat,生产严禁直接 rm -rf / 批量删库,需先备份、再过滤删除
-
日志查看:cat、more、less、tail -f、tail -n、head、grep、sed、awk,线上日志筛选、关键词检索、日志统计核心工具
-
权限管理:chmod(修改权限)、chown(修改属主属组)、chgrp(修改所属组),解决服务无权限写日志、无权限启动问题
-
压缩解压:tar、zip、unzip、gzip,线上日志打包、备份、迁移必备
-
查找命令:find(磁盘文件查找)、which(命令路径查找)、whereis(系统文件查找)
4. 面试&生产落地
线上服务启动失败、日志无法写入、文件丢失、权限拒绝报错,90%都是文件权限、目录不存在、用户权限不足导致;生产必须规范文件目录权限,统一服务运行用户。
第2章 进程管理与服务常驻(Java进程核心)
1. 核心定义
进程是Linux资源分配单元,Java服务、Nginx、Redis、MySQL均以独立进程运行,进程状态、资源占用直接决定服务运行状态。
2. 进程核心状态
-
R运行态:正在占用CPU执行
-
S睡眠态:等待资源就绪(网络、IO、锁)
-
D不可中断睡眠:磁盘IO阻塞,无法被唤醒,极易导致服务卡顿
-
Z僵尸进程:子进程退出、父进程未回收,占用进程号资源
-
T暂停态:被暂停运行
3. 高频进程命令
-
ps -ef / ps aux:查看全量进程、PID、占用资源、父进程
-
top:实时动态监控进程CPU、内存占用、负载情况
-
kill / kill -9:普通关闭、强制杀死进程(生产慎用-9,会丢失内存数据)
-
pkill、pgrep:批量检索、批量终止进程
4. 僵尸进程&孤儿进程生产问题
僵尸进程过多会耗尽系统PID资源,导致无法新建进程;解决方案:父进程正常回收子进程、启动进程托管、配置系统自动回收。
5. 服务常驻运维
nohup、&后台运行、screen、systemd托管;生产Java服务统一使用systemd实现开机自启、异常重启、日志托管、进程守护,避免窗口关闭服务退出。
第3章 系统性能三剑客(线上性能排查核心)
1. vmstat 全局性能监控
核心作用
监控系统全局状态:CPU、内存、磁盘IO、上下文切换、中断、Swap使用情况,快速定位整机瓶颈。
核心指标(生产必看)
-
cs(上下文切换):数值过高,线程频繁切换,CPU利用率低、服务卡顿
-
si/so(Swap进出):不为0表示内存不足,发生内存置换,服务严重卡顿
-
us/sy:用户态、内核态CPU占比,us高应用代码问题,sy高系统内核/IO问题
2. iostat 磁盘IO专项排查
核心作用
精准定位磁盘读写压力、IO等待耗时,是排查IO瓶颈、数据库卡顿、日志刷屏核心工具。
核心指标
-
%util:磁盘繁忙率,接近100%表示磁盘打满,IO瓶颈
-
await:IO平均等待时间,耗时越高队列阻塞越严重
-
rMB/s、wMB/s:实时读写速度,判断是否存在大量日志刷盘、持久化刷屏
3. sar 历史性能复盘
核心作用
唯一可以复盘历史性能数据的工具,可查询过去CPU、内存、网络、磁盘状态,用于事后故障复盘。
常用场景
sar -u 查CPU、sar -r 查内存、sar -n DEV 查网络流量。
第4章 网络深度排查体系(线上超时/丢包/连接异常全解)
1. 网络连通性排查链路(标准生产流程)
ping 连通性检测 → mtr 精准丢包定位(替代ping,生产首选) → traceroute 路由追踪 → 端口连通检测 → 抓包分析。
2. 端口与连接状态排查
核心命令
ss -s、ss -tulnp:替代老旧netstat,高效统计TCP全状态连接,速度极快。
TCP核心状态生产解读
-
SYN_RECV:收到连接请求,队列满导致无法建立连接,防SYN攻击
-
ESTABLISHED:正常活跃连接,数量异常偏高存在连接不释放泄露
-
TIME_WAIT:主动关闭连接,高并发短连接堆积耗尽端口
-
CLOSE_WAIT:被动关闭未释放,代码连接泄露Bug
3. 线上抓包分析
tcpdump 线上无损抓包,精准定位请求丢失、重传、粘包、握手失败、超时断开等网络问题,是分布式接口调用异常终极排查手段。
4. 防火墙与安全策略
iptables、firewalld端口放行、IP白名单、流量转发;线上接口不通、跨机器访问失败,优先排查防火墙策略。
第5章 Linux内核生产调优(资深高薪核心)
1. 网络内核调优(高并发服务必备)
核心问题
高并发短连接场景端口耗尽、TIME_WAIT堆积、SYN攻击、连接队列溢出。
核心调优参数(可直接上线配置)
-
net.ipv4.tcp_tw_reuse=1:复用TIME_WAIT连接,释放端口资源
-
net.ipv4.tcp_syncookies=1:开启SYN防攻击,抵御恶意连接洪水
-
net.ipv4.ip_local_port_range:扩容本地可用端口范围
-
net.core.somaxconn:增大服务监听队列,解决连接队列溢出报错
-
net.ipv4.tcp_fin_timeout:缩短超时回收时间,快速释放无效连接
2. 内存内核调优(防止OOM与卡顿)
-
vm.swappiness=10:降低Swap使用率,优先使用物理内存,避免磁盘置换卡顿
-
vm.dirty_ratio、vm.dirty_background_ratio:优化脏页刷盘阈值,平滑IO峰值,避免瞬间批量刷盘卡顿
-
调整OOM优先级,核心服务禁止被OOM Killer杀死
3. 文件句柄与资源限制调优
核心问题
Java、Netty、MQ、数据库都是IO密集型服务,默认句柄数过低,会出现Too many open files崩溃报错。
调优方案
修改ulimit -n 提升最大文件句柄数、修改系统全局limits.conf,永久生效,适配高并发长连接服务。
4. IO内核调优
调整磁盘IO调度算法、提升队列深度、优化读写缓存策略,减少读写放大,适配SSD固态硬盘生产环境。
第6章 线上故障排查标准流程(资深工程师方法论)
1. 服务卡顿/响应慢排查链路
查看CPU负载 → 查看内存&Swap → 查看磁盘IO繁忙率 → 查看网络连接状态 → 查看日志报错 → 定位代码/内核瓶颈。
2. 服务宕机排查链路
查看系统日志messages → 查看OOM杀死记录 → 查看进程退出日志 → 排查资源耗尽、参数错误、代码死锁。
3. 接口超时排查链路
网络丢包/重传 → 连接堆积 → 队列溢出 → 线程阻塞 → GC卡顿 → 数据库慢SQL。
第7章 自动化运维与生产规范
1. Shell脚本实战
批量启停服务、批量日志清理、批量文件备份、数据同步、监控告警脚本,提升运维效率,避免重复人工操作。
2. Crontab定时任务
定时日志切割、定时数据备份、定时巡检、定时清理临时文件;生产禁止高频定时任务,避免瞬间资源打满。
3. 日志规范
logrotate日志切割,防止单日志文件过大占满磁盘,自动分割、压缩、过期删除,保障服务长期稳定运行。
4. Systemd服务托管
统一服务配置、开机自启、异常自动重启、日志统一收集、资源限制,是生产Java服务标准部署方式。
第8章 面试&生产高频总结(必背)
-
CPU高:优先排查应用死循环、频繁GC、大量上下文切换
-
内存高:内存泄漏、缓存溢出、Swap置换、堆内存溢出
-
IO高:日志刷屏、数据库频繁刷盘、大量随机IO
-
网络异常:连接泄露、TIME_WAIT/CLOSE_WAIT堆积、端口耗尽、队列溢出
-
服务挂掉:文件句柄耗尽、OOM杀死、端口占用、内核参数限制
Linux生产实战简洁版
第1章 高频基础命令
文件操作、权限管理(chmod/chown)、进程查看、解压压缩、用户管理、日志查看。
第2章 性能分析三剑客
-
vmstat:全局监控CPU、内存、IO、上下文切换、中断。
-
iostat:精准分析磁盘读写负载、IO等待、读写速度。
-
sar:全维度系统资源监控,复盘历史性能数据。
第3章 网络深度排查体系
连通性排查:ping → mtr(精准丢包) → traceroute(路由追踪)
连接统计:ss 替代 netstat,高效统计TCP各状态连接数
抓包分析:tcpdump 线上抓包,分析粘包、重传、异常报文、协议错误
防火墙:iptables、firewalld 规则配置与排查
第4章 内核生产调优(资深核心)
1. 网络调优
提升最大文件句柄、开启tw_reuse复用TIME_WAIT、开启syncookies防SYN攻击、扩容本地端口范围。
2. 内存调优
降低Swap使用率、优化脏页刷盘参数、保护核心进程不被OOM杀死。
3. IO调优
调整磁盘IO调度算法、优化队列深度、减少读写放大。
第5章 自动化运维
Shell脚本批量处理、crontab定时任务、日志切割、systemd服务托管、进程常驻守护。
模块五:资深Java专属底层进阶(中高级分水岭·完整版)
模块前言:资深与中级核心分水岭
普通中级开发仅掌握API调用、业务编码、框架使用 ;资深Java工程师核心壁垒是吃透硬件底层、操作系统内核、并发底层原理,能够解释JMM、volatile、CAS、锁机制、高并发性能问题的底层根源,能解决线上隐形性能瓶颈、并发Bug、硬件层级性能损耗。本模块是JUC并发、JVM调优、中间件高性能架构的终极底层基石,也是大厂资深面试必问压轴知识点。
第1章 计算机组成原理(并发高性能硬件基石)
1. CPU多级缓存体系(核心定义)
CPU为解决运算速度远超内存读写速度的速度鸿沟,设计了L1/L2/L3三级高速缓存,层级越靠近CPU,速度越快、容量越小、造价越高,是Java高并发高性能的硬件核心支撑。
2. 底层原理与层级特性
CPU运算速度 >> L1缓存 > L2缓存 > L3缓存 > 内存 > 磁盘;各级缓存缓存数据以缓存行(Cache Line) 为最小存储单位,主流CPU缓存行固定为64字节。
层级分工:L1/L2为CPU核心独占缓存,读写速度极快;L3为多核共享缓存,用于多核数据交互同步,协调多核心数据一致性。
3. 特点与优劣
-
优点:极大降低CPU访问内存的频次,规避内存IO低速瓶颈,成倍提升程序运行效率
-
缺点:多级缓存存在数据不一致问题、缓存行机制会引发伪共享、CPU会基于缓存做指令重排,带来并发安全问题
4. 面试&生产落地
所有Java高并发优化、缓存优化、对象内存布局优化,本质都是利用CPU缓存特性、规避缓存失效问题;Disruptor高性能框架、Netty内存优化、并发工具类底层均依赖CPU缓存原理。
第2章 伪共享(高并发隐形性能杀手)
1. 核心定义
伪共享 :多个线程同时修改同一个CPU缓存行内的不同独立变量,导致缓存行频繁失效、触发缓存刷新,造成严重的CPU性能损耗,是高并发场景极易忽略的隐形瓶颈。
2. 底层原理
CPU缓存以64字节缓存行加载数据,若多个互不相关的共享变量存储在同一个缓存行中,任意一个线程修改其中一个变量,都会导致整行缓存失效;其他线程修改同缓存行内其他变量时,必须重新从内存加载数据,频繁触发缓存同步,大幅降低并发执行效率。
3. 解决方案与优劣
核心解决方案:缓存行填充(Padding),通过填充无用字节,让独立共享变量独占一个缓存行,避免多线程竞争同一缓存行。
JDK1.8提供注解@sun.misc.Contended自动完成缓存行填充,简化开发,适配高并发工具类。
4. 面试&生产落地
典型落地场景:JDK线程池、ConcurrentHashMap、Disruptor无锁队列、高性能计数器;生产中高频并发变量必须做缓存行填充优化,否则高并发下性能断崖式下跌。
第3章 CPU指令重排与内存屏障(JMM核心底层)
1. 核心定义
CPU为最大化利用运算资源、提升执行效率,会在不改变单线程执行结果 的前提下,打乱代码指令的原始执行顺序,该行为称为指令重排序,是并发有序性问题的根本诱因。
2. 重排分类与底层原理
指令重排分为三级:编译器重排(JVM编译优化)、CPU指令级重排、CPU内存系统重排;单线程下重排无任何影响,多线程共享变量场景会引发数据错乱、逻辑异常。
3. 内存屏障机制(解决方案)
内存屏障是CPU提供的指令,用于禁止指令重排、强制刷新缓存数据,彻底解决重排导致的有序性、可见性问题,分为四类:
-
LoadLoad屏障:禁止读-读重排
-
StoreStore屏障:禁止写-写重排
-
LoadStore屏障:禁止读-写重排
-
StoreLoad屏障:禁止写-读重排(最强屏障,volatile底层核心)
4. 面试&生产落地
volatile关键字底层完全依赖内存屏障实现:禁止指令重排、强制变量读写穿透缓存同步内存数据,保证多线程可见性与有序性;DCL单例模式必须加volatile,本质就是规避指令重排导致的空指针问题。
第4章 缓存一致性协议(多核并发数据安全基石)
1. 核心定义
多核CPU场景下,每个核心拥有独立缓存,为保证多个缓存副本数据一致,CPU硬件层面实现MESI缓存一致性协议,解决多核缓存数据不一致问题。
2. 底层原理(MESI四状态)
缓存行存在四种状态,通过总线消息实时同步状态:
-
M(Modified修改态):当前核心修改数据,未同步内存,数据独占且失效其他核心缓存
-
E(Exclusive独占态):当前核心独占缓存行,数据与内存一致
-
S(Shared共享态):多个核心缓存同一数据,数据与内存一致
-
I(Invalid失效态):当前缓存行数据失效,需重新加载
3. 特点与优劣
优点:硬件层面保证多核缓存数据一致性,无需应用层干预,保障并发数据安全;缺点:缓存状态同步会产生总线开销,高并发竞争下性能损耗明显。
4. 面试&生产落地
CAS、锁机制、volatile可见性的底层硬件支撑就是MESI协议;大量线程竞争同一共享变量时,频繁的缓存状态切换会导致CPU飙高、性能下降,是并发优化的核心切入点。
第5章 原子操作硬件底层(CAS核心原理)
1. 核心定义
Java无锁CAS操作的底层依托CPU硬件级原子指令,实现无锁状态下的变量原子读写与更新,替代重量级锁,大幅提升并发性能。
2. 底层原理:总线锁 & 缓存锁
-
总线锁:早期CPU通过锁定系统总线,禁止其他核心读写内存,实现原子操作,开销极大、性能低
-
缓存锁:现代CPU基于MESI协议,锁定缓存行替代总线锁,仅锁定当前数据缓存行,不影响其他数据读写,性能极高,是CAS底层实现
3. CAS机制优缺点
-
优点:无线程阻塞、无上下文切换、并发性能远优于synchronized重量级锁
-
缺点:存在ABA问题、循环自旋空耗CPU、只能保证单个变量原子性
4. 面试&生产落地
Atomic系列原子类、AQS同步器、ConcurrentHashMap、自旋锁底层全部基于CAS实现;生产中低并发竞争场景用锁,高并发轻竞争场景优先用CAS无锁操作。
第6章 存储硬件IO原理(中间件调优终极底层)
1. HDD机械硬盘 vs SSD固态硬盘
核心原理与特性对比
-
HDD机械硬盘:依靠磁头机械寻址读写,顺序IO速度快,随机IO需要频繁移动磁头,耗时极高、性能极差,存在机械损耗
-
SSD固态硬盘 :闪存芯片读写,无机械结构,随机IO性能碾压HDD,读写延迟极低;存在读写放大、擦除磨损问题
2. 工程顶级核心准则(必背)
所有数据库、缓存、消息队列、文件存储的性能优化,本质只有一条:规避随机IO、放大顺序IO。MySQL索引、Redis持久化、MQ日志存储、分库分表,全部基于该底层逻辑设计。
3. 操作系统页缓存与脏页机制
Linux为弥补磁盘低速缺陷,引入**页缓存(PageCache)**机制,程序读写磁盘数据优先操作内存页缓存,减少直接磁盘IO,大幅提升吞吐。
被修改的页缓存数据为脏页,内核会定时或阈值触发刷盘,将脏页同步到磁盘,是所有中间件异步持久化的核心底层机制。
4. 面试&生产落地
MySQL批量插入、Redis RDB/AOF持久化、MQ顺序写日志,都是为了适配磁盘顺序IO特性;线上磁盘IO飙高、服务卡顿,大概率是大量随机IO、脏页集中刷盘导致。
第7章 Java并发三大核心特性(JMM体系总纲)
1. 核心定义
Java多线程并发安全的三大基石:原子性、可见性、有序性,所有并发Bug、并发工具、锁机制、JMM模型,都是为了解决这三个特性的缺失问题。
2. 底层问题根源
三大并发安全问题,全部源于硬件与系统底层机制:
-
原子性问题:多线程交叉执行,复合操作不具备不可分割性
-
可见性问题:CPU多级缓存导致线程本地缓存与内存数据不一致
-
有序性问题:CPU+编译器指令重排打乱代码执行逻辑
3. 解决方案全覆盖
-
原子性:synchronized锁、Lock锁、CAS原子操作
-
可见性:volatile关键字、锁机制(加锁刷新缓存)
-
有序性:volatile内存屏障、锁机制(保证串行执行,规避重排)
4. 面试&生产落地
判断并发代码是否线程安全,只需校验是否同时满足三大特性;生产中volatile只能解决可见性、有序性,无法保证原子性,不能用于计数、自增等复合操作。
第8章 JMM Java内存模型(并发底层终极模型)
1. 核心定义
JMM(Java Memory Model) 是Java虚拟机定义的一套多线程内存访问规范,屏蔽不同硬件、操作系统的内存差异,统一Java并发内存语义,解决多线程数据安全问题。
2. 底层内存划分原理
JMM将内存分为两大区域:
-
线程私有工作内存:每个线程独占,存储变量副本,读写优先操作本地缓存,速度快
-
主内存:共享内存,存储所有共享变量原始数据,线程间通信必须通过主内存中转
线程间无法直接交互,必须:工作内存 ↔ 主内存 ↔ 其他线程工作内存,该机制是可见性问题的直接来源。
3. JMM八大内存交互操作
主内存与工作内存的数据读写,严格遵循load、store、read、write、lock、unlock、use、assign八大原子操作,保证内存交互规范。
4. happens-before先行发生原则(面试核心)
JMM通过happens-before规则界定指令执行顺序,无需依赖内存屏障即可保证有序性,核心常用规则:
-
程序顺序规则:单线程内操作有序
-
锁规则:解锁操作先行于后续加锁操作
-
volatile规则:写操作先行于后续读操作
-
线程启动规则:start()先行于线程所有操作
-
线程终止规则:线程所有操作先行于线程终止检测
5. 面试&生产落地
JMM是所有Java并发工具的理论基石,synchronized、volatile、AQS、线程池的底层语义全部基于JMM实现;理解JMM才能彻底搞定并发安全、指令重排、可见性疑难问题。
第9章 资深底层核心思维总结
-
所有并发问题,根源都是硬件问题:CPU缓存、指令重排、上下文切换是并发Bug与性能瓶颈的本质
-
所有存储优化,根源都是IO优化:规避随机IO、利用页缓存、减少刷盘次数是存储中间件核心优化逻辑
-
所有Java语法特性,都是底层封装:volatile、锁、CAS本质都是对CPU硬件、系统内核能力的封装
-
资深工程师核心能力:透过业务API,看懂底层硬件、内核、JVM机制,预判风险、优化性能、解决疑难故障
全书终章:Java资深工程师底层思维总结
1. 网络思维:所有分布式通信、网关、RPC、MQ 都建立在 TCP/IP、HTTP 底层机制之上,线上超时、丢包、连接泄露均源于网络底层。
2. 系统思维:JVM内存、线程调度、IO读写、卡顿瓶颈,全部受操作系统内核机制约束。
3. 数据结构思维:Java集合、Redis、MySQL索引、限流缓存,全部依赖底层数据结构特性。
4. 生产思维:所有线上调优、故障排查,最终回归 Linux 内核参数、硬件IO、CPU缓存底层。
5. 资深分水岭思维 :中级只会用API,资深能通过底层原理解释现象、预判风险、做架构优化、解决疑难线上问题。