Archives
All the articles I've archived.
-
TLAB——线程本地分配缓冲如何让对象分配几乎无锁
JVM 在 Eden 区为每个线程预分配私有内存块 TLAB,让对象分配几乎无锁,解决多线程并发 new 的性能瓶颈。
-
MySQL插入意向锁——间隙锁的并发优化变体
插入意向锁是间隙锁的并发优化变体,同间隙不同位置互相兼容,仅被真正间隙锁阻塞,兼顾 RR 防幻读语义与并发插入吞吐
-
ZGC——着色指针与读屏障实现亚毫秒级停顿
ZGC 通过着色指针将 GC 元数据编码到指针中,结合读屏障实现亚毫秒级停顿,且停顿时间不随堆大小增长。
-
Redis Cluster Gossip协议——去中心化的元数据传播
深入解析 Redis Cluster 基于 Gossip 的去中心化节点发现与故障检测机制,涵盖 PING/PONG 交换、PFAIL/FAIL 两级判定与 16384 槽位设计。
-
RocketMQ DLedger——基于Raft的CommitLog多数派提交
解析 RocketMQ DLedger 如何将 Raft 共识协议嵌入 CommitLog 写入路径,以多数派提交替代异步复制实现自动故障切换,以及为什么 ConsumeQueue 不参与 Raft 同步。
-
双亲委派机制——为什么你不能自定义java.lang.String
双亲委派机制自底向上检查、自顶向下加载,保证核心类不被篡改,是 Java 类加载安全的基石。
-
中断机制详解:从硬件信号到内核处理的全链路
从硬件信号到内核处理的全链路:中断控制器、IDT、保存现场、中断处理函数、恢复返回,完整覆盖中断处理流程。
-
TCP为什么可靠传输:六大机制协同保障数据完整性
TCP 通过校验和、确认应答、重传、序列号、流量控制和拥塞控制六大机制协同保障数据无差错、不丢失、不重复、按序到达。
-
Copy on Write原理:fork背后的内存优化魔法
fork 时只复制页表不复制物理页,通过清除写权限位让写操作触发缺页中断才真正复制,将全量拷贝转化为按需增量复制。
-
缓存预热策略——启动时就把热数据装进Redis
服务启动时通过 ContextRefreshedEvent 加 Pipeline 批量写入预热缓存,用分布式锁和就绪探针保障冷启动安全。
-
异步化改造邮件发送——从同步阻塞2秒到异步立即返回
将邮件发送从主线程剥离为异步执行,配合线程池配置与持久化保障,实现用户体验从 2 秒到 50ms 的飞跃。
-
圈复杂度——McCabe公式与重构的数学依据
圈复杂度用 McCabe 公式(V=E-N+2P)量化代码的独立路径数,为重构提供数学依据,指导函数拆分与测试用例设计。
-
乐观锁与悲观锁——读多写少与写多的两种世界观
乐观锁用 CAS/版本号以无锁方式应对低冲突场景,悲观锁用数据库行锁保证强一致性,理解两种世界观的选择依据。
-
Segmented分段锁——从单锁串行到10倍并发的演进
从秒杀库存扣减到 10 倍并发提升——分段锁将全局资源按 userId 分片,不同分段的操作完全并行,配合段间迁移补偿与死锁防护,思想在 ConcurrentHashMap、LongAdder 中均可见。
-
RestTemplate连接池优化——每次new都要三次握手?
揭示 RestTemplate 默认构造器的性能黑洞——每次 HTTP 请求新建 TCP 连接,详解 HttpComponentsClientHttpRequestFactory 连接池化的完整生产级配置。
-
Nginx vs Tomcat——为什么有了Nginx还要用Tomcat?
Nginx(C 语言反向代理零拷贝静态资源)与 Tomcat(Java Servlet 容器业务引擎)分工明确,黄金组合各司其职不可互相替代
-
Java AIO与io_uring——为什么AIO在Linux上是"伪异步"?
同步非阻塞与异步根本区别在谁负责读数据到用户缓冲区,Java AIO 在 Linux 底层用 epoll 模拟,io_uring 通过共享环形队列实现真正内核异步 IO。
-
JMeter压测方法论——从QPS概念到渐进式性能优化
QPS 是 HTTP 层请求数 TPS 是业务事务数二者不可混用,看 P99 而非 Average 才能发现长尾延迟,渐进式加压找到拐点比最高 QPS 更有意义。
-
JDBC批量插入——从1000次网络IO到1次
JDBC 批量插入核心优化链:executeBatch 减少网络往返 30 倍,加 rewriteBatchedStatements=true 合并 SQL 解析再提速至 100 倍。
-
HikariCP连接池优化——从参数配置到底层原理
HikariCP 以无锁 ConcurrentBag 加速连接借还,maximum-pool-size 遵循 CPU 核数×2+磁盘数公式,max-lifetime 须小于数据库 wait_timeout。
-
Consul服务注册与发现——告别手动Nginx配置
Consul 通过服务注册、Agent 健康检查自动摘除故障节点、consul-template 动态渲染 Nginx 配置,实现微服务无感扩缩容。
-
面试回答策略——信息密度与"先结论后细节
面试回答采用先结论后细节的策略,将 80%的细节留给面试官追问,用钩子引导对话进入自己准备的领域。
-
算法面试的心智模型——从暴力到最优的渐进优化
算法面试三步法:先说暴力解展现理解,再分析瓶颈定位方向,最后优化到最优并分析复杂度。
-
自我介绍——60秒内让面试官选择聊你准备最充分的话题
四段式 60 秒自我介绍:背景、技术栈钩子、项目亮点、主动邀请,把选择权给面试官,准备权留给自己。
-
简历优化——技术简历的STAR化与量化改造
将简历从功能列表改造为 STAR 化问题清单,用数据和路径展示决策深度,而非堆砌形容词。
-
渐进式优化方法论——从虚拟线程优化看工程决策路径
渐进式优化的四步法:拿基线数据、调参移瓶颈、架构重构、技术跃迁,每步用数据回答瓶颈在哪。
-
八股与项目的模板化回答——从本质到钩子的四段式结构
八股四段式(本质→效果→核心细节→面试钩子)将技术概念讲得有深度,项目三段式让简历产出可量化、有影响力。
-
STAR法则——把项目经历讲成故事的完整模板
用 STAR 法则将技术优化路径讲成故事——侧重展示决策过程而非最终方案,用数据化对比强化结果,并留钩子主动引导面试官进入你准备最充分的领域。
-
Java后端学习路线——从语言基础到分布式系统
从语言基础到框架中间件再到系统设计三阶段学习路线,每学一个中间件回答解决什么问题、代价是什么、原理是什么三个问题。
-
HR面试完全手册——价值观、稳定性、潜力三个维度
HR 面考察价值观匹配、稳定性与潜力三维度,核心策略是按公司文化放大真实特质,T 字型规划展现扎根深耕与长期价值。
-
雪花算法——分布式全局唯一ID的64bit设计
雪花算法用 41bit 时间戳保证趋势递增避免 B+树页分裂,时钟回拨通过等待、拒绝或扩展序列号三种策略应对。
-
秒杀系统设计——从超卖到分段锁的完整演进
从数据库行锁到 Redis 分布式锁再到分段锁的四层演进,将秒杀 QPS 从超卖提升至 50000。
-
海量数据处理——从哈希分桶到位图的通用解题框架
以哈希分桶分治为核心,结合位图法去重、小顶堆求 TopK、多路归并排序,构成海量数据处理的完整工具箱。
-
大规模登录系统——从Session到JWT到OAuth2
从单体 Session 到 JWT 到 OAuth2 的登录系统演进:分布式 Session 共享、JWT 无状态认证、OAuth2 第三方授权,逐级解决规模问题。
-
分布式事务——从2PC到Seata AT的选型全景
从 2PC 到 Seata AT 的分布式事务全景选型:强一致的协调者模型与最终一致的业务补偿模型的权衡与适用场景。
-
不停机数据迁移——PostgreSQL到Redis ZSet的双写灰度三阶段
从 PostgreSQL 到 Redis ZSet 的不停机迁移实战:双写→灰度切读→全量切换三阶段,对用户零感知的线上数据迁移方案。
-
Netty的Reactor模式——从单线程到主从多线程
Netty 主从 Reactor 三层解耦:BossGroup 处理 accept、WorkerGroup 处理 IO 读写 epoll、业务线程池执行耗时逻辑,默认 ET 模式
-
LSM树——写多读少场景下的存储引擎王者
LSM 树将随机写转为顺序写,通过 MemTable 内存排序+SSTable 分层+后台 Compaction,以读放大换写入高吞吐
-
CAP定理、BASE理论与Raft共识算法——分布式理论的基石
CAP 定义分布式理论边界,BASE 落地为最终一致性工程折中,Raft 通过 Leader 选举与多数派日志复制实现可理解的共识算法。
-
高楼扔鸡蛋——动态规划的逆向思维
鸡蛋有限时二分查找并非最优,最优策略让每次测试为最坏情况预留的测试次数相同,体现均匀分配风险原则。
-
赛马问题——25匹马5条跑道找前三需几场?
通过分组赛缩小候选范围,冠军赛确定第一名,淘汰逻辑压缩候选集,最终决赛解决余量,共需 7 场。
-
蓝眼睛悖论——Common Knowledge的归纳推理
蓝眼睛悖论揭示公共知识的建立为数学归纳法提供了 base case,游客的话将已知信息转化为公共共识。
-
海盗分金币——逆向归纳法的博弈论经典
通过逆向归纳法从最后一轮往前推导,每轮提案者以最低成本收买在自己被否决后过得最差的选民。
-
Claude Code vs Codex:两种 Agent 编排哲学
从源码层面对比 Claude Code 与 Codex CLI:两者都是本地 coding agent 且都支持 Skill、Hook、MCP、AGENTS.md,真正的差异在实现栈、云端沙箱并行与多模型、以及 IDE 与企业集成深度。
-
长任务状态管理:跑两小时的任务怎么不丢状态
Agent 长任务的状态管理:状态机、断点续跑、任务队列、幂等,以及上下文压缩与状态的关系。
-
Subagent 与 Skill 注入:多 Agent 编排的艺术
为什么单 Agent 不够:上下文污染、自我肯定偏差、难并行,以及 Subagent 分工隔离与 Skill 按需注入的解法。
-
水桶取水——扩展欧几里得算法的编程题转化
水桶取水问题的数学本质是贝祖定理判断可解性,扩展欧几里得算法求解通解,BFS 求最小步数。
-
上下文压缩与 Memory 管理:窗口不够用怎么办
Agent 上下文窗口不够用的三类解法:压缩、外置记忆、分层索引,以及记忆的写入时机工程。
-
提示词工程:System Prompt 怎么驯服模型
System Prompt 的工程方法:角色设定、约束注入、few-shot、结构化输出,以及 Claude Code 的 Skill 注入如何解决提示词过长的问题。
-
二进制思维——从毒药白鼠到分金块的编码艺术
毒药白鼠、分金块等经典智力题的二进制编码思想:用有限的二元状态编码远超出直觉的状态空间。
-
Agent 的本质:LLM + Tool Loop
拆解 Agent 的核心机制 Tool Loop:think、act、observe 三环节与 ReAct 范式,以及循环卡死、token 爆炸、结果格式化等工程问题。
-
AI Agent 工程地图——从 LLM 到可编程 Agent
AI Agent 工程系列总纲:把 Agent 拆成 LLM 加工具循环、记忆、编排四层,勾画五大核心主题与 Claude Code 对 Codex 两种编排哲学。
-
不均匀硬币如何公平决策——抛两次的巧妙解法
利用抛两次硬币取正反/反正序列的对称概率巧妙实现公平决策,揭示伯努利试验的数学之美。
-
大数据处理题汇总——通用框架 + 10 道高频题
海量数据处理题完整汇总:哈希分桶、位图、小顶堆、多路归并等通用框架,以及 URL 去重、Top100 高频词、40 亿整数判断、5 亿中位数等 10 道高频题。
-
面试智力题汇总——12 大类高频题
面试智力题 12 大类完整汇总:二进制、先手必胜、推理、概率、水桶计时赛马、过河过桥、最优解、数字、砝码、灯泡开关、蓝眼睛等,每题含核心思路。
-
Rand5生成Rand7——拒绝采样的原理与应用
用两次 rand5 构造 25 种等概率结果放大到 7 以上,截断 21 后模 7 映射,22~25 拒绝重试,拒绝采样保证严格均匀分布
-
SQL 手撕题库——50 道高频题(含预备题与规律速查)
手撕 SQL 题库 50 道高频题完整整理,含班级成绩预备题、每道题的四步模板与坑点、以及 IN vs EXISTS 等核心规律速查。
-
其他问题——智力题、大数据处理、SQL 题
面试里的三类「其他问题」完整题库:SQL 手撕 50 题、智力题 12 大类、大数据处理 10 题,各整理成一篇。
-
LeetCode 解题模板——核心建模 + 常用 API 速查(一个题型一个模板)
LeetCode 全题型解题模板:每个题型先讲核心建模(最该关心的问题),再给模板、变量、返回值、易错点;末尾附常用 API 与 Lambda 表达式速查。
-
SQL窗口函数——ROW_NUMBER vs RANK vs DENSE_RANK
通过同一份数据对比 ROW_NUMBER、RANK 与 DENSE_RANK 的核心区别,掌握 PARTITION BY 分组窗口与 TopN Per Group 经典模式,区分窗口函数与 GROUP BY 的本质差异。
-
设计模式面试回答——单例、工厂、策略、责任链与代理
设计模式面试回答三版本:单例、工厂、模板方法、策略、责任链、代理、装饰器的一句话结论、核心原理与源码应用。
-
并发编程面试回答——锁、线程池、ThreadLocal 与 JUC
并发编程面试回答三版本:锁机制、并发底层、线程池、ThreadLocal、JUC 工具类、Unsafe 的一句话结论与核心原理。
-
JVM 面试回答——内存结构、GC、G1/ZGC 与类加载
JVM 面试回答三版本:内存结构、GC 算法、G1/ZGC、类加载、双亲委派、高级特性的一句话结论与核心原理。
-
SQL陷阱——NOT EXISTS vs NOT IN,NULL毁掉一切
揭示 NOT IN 与 NOT EXISTS 的根本差异——SQL 三值逻辑下 NULL 使 NOT IN 永远返回空集,并给出 NOT EXISTS 替代方案和集合相等判断技巧。
-
Spring 面试回答——IOC、AOP、Bean 生命周期与循环依赖
Spring 面试回答三版本:IOC、AOP、Bean 生命周期、循环依赖、事务失效、自动装配的一句话结论与核心原理。
-
RocketMQ 面试回答——架构、可靠消息、高可用与死信队列
RocketMQ 面试回答三版本:架构设计、消息可靠原理、集群高可用、死信队列的一句话结论与核心原理。
-
SQL行转列——CASE WHEN + MAX + GROUP BY的通用范式
详解 SQL 行转列的通用范式——CASE WHEN + MAX + GROUP BY 跨数据库标准解法,以及 MAX 用来从有值+N 个 NULL 中挑出唯一非 NULL 值的底层原理。
-
Redis 面试回答——数据结构、持久化、高可用与缓存设计
Redis 面试回答三版本:核心数据结构、持久化策略、IO 模型、高可用、高性能、缓存设计、并发控制的一句话结论与核心原理。
-
MySQL 面试回答——事务 MVCC、索引、锁、日志与主从
MySQL 面试回答三版本:事务与 MVCC、存储引擎、索引、锁、日志、SQL 优化、主从架构的一句话结论与核心原理。
-
Java 基础面试回答——IO 模型、HashMap、ArrayList、Java8 与虚拟线程
Java 基础面试回答三版本:IO 模型、HashMap、ArrayList、Java8 新特性、虚拟线程的一句话结论、核心原理与底层深入。
-
LeetCode Hot 100——SQL篇(窗口函数、NOT EXISTS、行转列)
SQL 五大技巧:窗口函数排名、NOT EXISTS 优于 NOT IN、CASE WHEN 行转列、GROUP_CONCAT 集合比较、HAVING 布尔聚合
-
面试回答框架——七要素与三版本
一套统一的面试回答框架:项目/实习用七要素(结论→背景→目标→难点→取舍→行动→复盘),知识类用三版本(30秒一句话/2分钟核心/5-10分钟深入),并对照 STAR 与系统设计四步法说明来龙去脉。
-
LeetCode Hot 100——技巧篇(位运算、多数投票、原地排序)
技巧五题:只出现一次的数字位运算、多数元素摩尔投票、颜色分类三路快排、下一个排列、寻找重复数。
-
LeetCode Hot 100——多维动态规划篇(路径、回文、编辑距离)
多维动态规划五题:不同路径、最小路径和、最长回文子串、最长公共子序列、编辑距离。
-
LeetCode Hot 100——动态规划篇(状态定义、转移方程、背包)
动态规划九题:爬楼梯、打家劫舍、零钱兑换、单词拆分、最长递增子序列、乘积最大子数组、分割等和子集、最长有效括号。
-
LeetCode Hot 100——贪心篇(买卖股票、跳跃游戏、区间划分)
贪心四题:买卖股票一次交易、跳跃游戏与跳跃游戏 II、划分字母区间维护最后出现位置。
-
LeetCode Hot 100——堆篇(TopK、频率统计、数据流中位数)
堆三题:第 K 大元素用最小堆、前 K 高频元素堆加哈希计数、数据流中位数用大小顶堆。
-
LeetCode Hot 100——栈篇(括号匹配、单调栈)
栈五题:有效的括号、最小栈、字符串解码、每日温度单调栈、柱状图中最大的矩形单调栈。
-
LeetCode Hot 100——二分查找篇(边界控制与旋转数组)
二分查找六题:搜索插入位置、二维矩阵、找首尾位置、搜索旋转数组、找最小值、两个正序数组的中位数。
-
LeetCode Hot 100——回溯篇(选择-递归-撤销、剪枝)
回溯八题:全排列与子集的选择撤销、组合总和剪枝、括号生成、单词搜索、分割回文串、N 皇后。
-
LeetCode Hot 100——图论篇(DFS、BFS、拓扑排序、Trie)
图论四题:岛屿数量 DFS 淹没、腐烂橘子多源 BFS、课程表拓扑排序判环、实现 Trie 前缀树。
-
LeetCode Hot 100——二叉树篇(遍历、深度、最近公共祖先)
二叉树十五题:中序与层序遍历、最大深度与直径、验证 BST、前中序构造、最近公共祖先、最大路径和。
-
字母异位词分组——HashMap处理集合分组的经典模式
利用规范表示作为 HashMap 的 key,将字母异位词归为等价类,揭示分组问题的通用模式。
-
LeetCode Hot 100——链表篇(反转、合并、环检测、K 个一组翻转)
链表十四题:三指针反转、dummy 节点合并、Floyd 快慢指针判环、K 个一组翻转、归并排序链表、LRU 缓存。
-
合并K个升序链表——小顶堆与分治归并
合并 K 个升序链表的两大解法:小顶堆每次取 K 个链表的当前最小头节点,分治法两两归并逐步合并,时间复杂度对比分析。
-
LeetCode Hot 100——矩阵篇(原地标记与转置翻转)
矩阵四题:矩阵置零首行首列标记、螺旋矩阵按层遍历、旋转图像转置加翻转、搜索二维矩阵 II 从左下角起步。
-
单调栈与滑动窗口——三个模板解决80%的数组区间问题
单调栈维护有序性解决下一个更大元素问题,单调队列维护时效性解决滑动窗口最大值,有序性与时效性的经典博弈。
-
动态规划——最优子结构与状态转移方程
动态规划两大要素——最优子结构与重叠子问题,通过状态定义和转移方程将指数级递归转化为多项式级递推求解。
-
LeetCode Hot 100——普通数组篇(前缀积与原地标记)
普通数组五题:最大子数组和 Kadane、合并区间排序、轮转数组三次反转、除自身乘积前后缀、缺失正数原地哈希。
-
前缀和+哈希表——子数组问题的万能钥匙
前缀和将子数组求和转化为两数之差,配合哈希表将 O(n²)降为 O(n),是子数组和类问题的万能解题模板。
-
LeetCode Hot 100——子串篇(前缀和与单调队列)
子串三题:和为 K 用前缀和哈希、滑动窗口最大值用单调队列、最小覆盖子串用双指针收缩。
-
原地哈希——把数组本身当成哈希表
把数组本身当哈希表,利用下标与值的映射关系原地标记状态,实现 O(1)空间解决缺失正整数等经典问题。
-
LeetCode Hot 100——滑动窗口篇(窗口收缩与计数维护)
滑动窗口两题:无重复字符最长子串用 Set 收缩窗口、字母异位词用固定窗口计数比对。
-
二叉树遍历——前序、中序、后序、层序的递归与迭代模板
前中后层序四种遍历的递归与迭代统一模板,前中后只是访问根节点的时机不同,层序用队列逐层处理。
-
LeetCode Hot 100——双指针篇(相向与快慢双指针)
双指针四题:移动零快慢指针、盛水容器相向收缩、三数之和排序去重、接雨水按列求和。
-
二分查找的8种变体——不只是找等于target
二分查找核心在于区间定义(左闭右闭/左闭右开),掌握 8 种变体模板统一解决查找等于、第一个、最后一个等场景。
-
LeetCode Hot 100——哈希篇(O(1) 补数查询与计数)
哈希表三题:两数之和 O(1) 补数查询、字母异位词分组排序作 key、最长连续序列用 Set 去重。
-
LRU缓存——HashMap+双向链表实现O(1)淘汰
HashMap 快速查找+双向链表维护访问顺序,实现 O(1)级 LRU 缓存淘汰,虚拟头尾节点简化边界操作
-
Kadane算法——最大子数组和的单遍历解法
Kadane 算法 O(n)单遍历解最大子数组和,curSum<0 时丢弃负数前缀重新开始,核心 dp[i]=max(nums[i],dp[i-1]+nums[i])
-
Floyd快慢指针——为何兔子和乌龟一定会相遇?
快慢指针每步缩小距离 1 保证环内必相遇,相遇后等速从表头和相遇点出发在环入口重逢,由数学推导 a=(n-1)L+c 保证正确性。
-
BFS与DFS——两种搜索模板解决所有遍历问题
BFS 层序遍历中每轮队列 size 计数是区分层级的关键,DFS 回溯枚举所有路径,两种模板覆盖所有图遍历场景。
-
从输入URL到页面展示——浏览器与网络的完整协作
从 URL 输入到页面展示经历 DNS、TCP、TLS、HTTP、解析渲染七个阶段,每个阶段都有对应的性能优化策略。
-
网页慢转圈排查:从物理层到应用层的分层诊断
从物理层到应用层的六层网页慢排查体系,先定位 TTFB 还是 Content Download,再逐层排障。
-
服务端正常启动但客户端请求不到:网络可达性排查全链路
从 ping 到 telnet 到防火墙到监听地址的六层可达性排查清单,覆盖 90%的服务连不上问题。
-
服务端大量TIME_WAIT:原因、危害与解决方案
TIME_WAIT 本质是 TCP 可靠关闭的副作用,解决关键在于减少连接创建销毁频率,而非盲目调整内核参数。
-
为什么四次挥手要等2MSL
TIME_WAIT 等待 2MSL 的两大原因:确保最后的 ACK 被对端接收,及让旧连接的迷途报文在网络中彻底消失。
-
为什么四次挥手中间两次不能合并
TCP 全双工通信决定了被动关闭方的 ACK 和 FIN 代表不同语义,中间两次不能合并,深入理解数据发送与关闭的独立性。
-
TCP粘包——三种应用层解决方案与Netty的实现
TCP 字节流没有消息边界,详解粘包根因及固定长度、分隔符、长度字段三种应用层解决方案与 Netty 实现。
-
TCP拥塞控制——从慢启动到BBR的演进
从慢启动到 BBR,详解 TCP 拥塞控制四大算法的状态迁移及 AIMD 动态调整拥塞窗口的核心思想。
-
TCP四次挥手——为什么TIME_WAIT要等2MSL?
深入解析 TCP 四次挥手全过程及 TIME_WAIT 状态的产生原因,理解主动关闭方为何需要等待 2MSL。
-
TCP与UDP区别:从传输层两大协议到QUIC的演进
TCP 面向可靠,UDP 追求速度,深刻理解传输层两种设计哲学的取舍及 QUIC 的演进方向。
-
TCP三次握手——为什么不是两次或四次?
论证 TCP 为什么三次握手刚好——两次不足以防止历史重复连接,四次没必要因为 SYN+ACK 可合并,三次精确满足双方确认收发能力+同步初始序列号+防旧连接干扰。
-
SYN Flood攻击与syncookies防御——半连接队列打满的原理
解析 SYN Flood 攻击原理——利用三次握手不对称性以极小成本打满半连接队列,syncookies 将连接状态编码进 ISN 序列号实现无状态防御,优雅地将存储开销转为计算开销。
-
SQL注入、XSS、CSRF——Web安全的三大经典攻击
梳理 Web 安全三大经典攻击的原理与防御——SQL 注入用参数化查询防代码拼接,XSS 靠输出编码+CSP+HttpOnly,CSRF 用 Token+SameSite Cookie 阻断跨站伪造。
-
OSI七层模型与TCP/IP四层模型
OSI 七层是理论蓝图先有模型后有协议,TCP/IP 四层是工程事实标准先有协议后有模型,分层思想使各层独立演进互不影响
-
Nginx负载均衡——5种算法与生产实践
Nginx 五种负载均衡算法:轮询、加权轮询平滑算法避免打桩、IP 哈希保持会话、URL 一致性哈希最小化缓存失效、最短时间商业版
-
HTTP长连接 vs WebSocket——从半双工到全双工的演进
HTTP 长连接只是复用 TCP 一问一答仍是半双工,WebSocket 通过 HTTP Upgrade 握手将 TCP 升级为全双工帧协议实现双向实时推送。
-
HTTP状态码与方法语义——从GET/POST到502/504
301 永久重定向浏览器缓存 SEO 权重传递,302 临时重定向每次回源;502 是上游无效响应,504 是上游超时无响应。
-
HTTPS握手过程——TLS是怎么保护通信安全的
TLS 1.2 用三个随机数协商会话密钥,ECDHE 临时密钥对实现前向安全,TLS 1.3 砍掉 RSA 精简为 1-RTT 并强制前向安全。
-
HTTP/2 vs HTTP/3——从TCP队头阻塞到QUIC的彻底解决
HTTP/2 多路复用解决 HTTP 层队头阻塞但受 TCP 层拖累,HTTP/3 基于 QUIC 让每个 Stream 独立重传彻底根除队头阻塞。
-
HTTP vs RPC:两种服务间通信协议的全面对比
HTTP 面向资源通用性强适合对外 API,RPC 面向方法高性能强类型适合内部微服务,网关层用 REST 内部用 gRPC 各取所长。
-
DNS域名解析——从输入URL到返回IP的完整链路
DNS 是分布式树状数据库,解析从浏览器缓存到 hosts 到递归查询根/TLD/权威服务器逐级查找,多级缓存使 90% 查询在本地完成。
-
DNS over TCP vs UDP:为什么域名解析默认走UDP
DNS 选 UDP 因其无连接 1-RTT 延迟、无状态低资源消耗完美匹配海量小查询模式,应用层超时重传加缓存补偿可靠性。
-
DDoS攻击详解:从僵尸网络到流量清洗
DDoS 是不对称资源消耗战:SYN Flood 半连接耗尽、UDP 反射放大、HTTP Flood 伪装正常请求,防御需 CDN 分散加流量清洗纵深体系。
-
Cookie、Session、JWT——三种会话机制的选型与实践
Cookie 是传输载体,Session 存服务端可主动销毁,JWT 自包含无状态验签适合分布式,三者配合使用形成完整鉴权体系。
-
页面置换算法——从OPT到LRU到Clock的演进
从 OPT 的理论下界到 Clock 的工程实现,Clock 算法用硬件访问位和环形指针以 O(1)复杂度近似 LRU 效果。
-
零拷贝——为什么Kafka和Nginx这么快?
零拷贝通过 sendfile 让数据从 Page Cache 直接到网卡,避免用户态中转,Kafka 吞吐量因此提升一倍。
-
进程间通讯IPC全览:七种方式的原理与选型
七种 IPC 方式按数据传输模式分为消息传递型、共享内存型和同步型,选型核心取决于数据量和通讯模式。
-
进程调度算法详解:从FCFS到多级反馈队列
从 FCFS 到多级反馈队列的六种调度算法演进,MLFQ 通过边运行边学习的动态优先级实现通用系统的最佳调度。
-
进程、线程、协程——三者的本质区别与适用场景
进程是资源分配的最小单位,线程是 CPU 调度的最小单位,协程在用户态调度实现极致轻量的并发模型。
-
虚拟内存与物理内存——操作系统最优雅的"骗局
虚拟内存通过 MMU 加页表加 TLB 加缺页中断让每个进程拥有独占内存的幻觉,同时实现隔离与高效利用。
-
线程间通讯方式:五种同步机制的原理与选型
线程间通讯的本质挑战不是传递数据而是安全地访问共享内存,五种同步机制各有适用临界区长度。
-
用户态和内核态:CPU权限隔离的底层原理
CPU 通过 Ring 0/3 硬件特权级实现用户态与内核态隔离,系统调用是跨越特权级的唯一合法桥梁。
-
死锁的四个条件与银行家算法
死锁是四个条件同时满足的必然结果,破坏任一条件即可免疫,资源有序分配是最常用的工程实践。
-
操作系统内存不足处理:从kswapd到OOM Killer的完整链条
从缺页中断到 kswapd 后台回收再到 OOM Killer 的完整内存回收递进链条,揭示了 Linux 内存管理的层层兜底机制。
-
堆和栈的区别——不只是"一个快一个慢
从内存布局到分配原理全面对比堆与栈:栈由编译器自动管理高效有序,堆由程序员手动管理灵活但易碎片。
-
中断机制——从缺页中断到系统调用
从缺页中断到系统调用,理解 CPU 如何通过中断向量表响应硬件事件和内部异常,实现多任务调度与内存管理。
-
select→poll→epoll——Linux IO多路复用的三代演进
Linux IO 多路复用三代演进:select 的位图局限、poll 的链表改进、epoll 的 O(1)事件通知与红黑树管理百万连接。
-
fork原理:进程创建的底层全链路
fork 一次调用两次返回的底层原理:通过写时拷贝技术高效复制进程地址空间,避免物理内存的完全拷贝。
-
epoll的LT和ET模式
epoll 的 LT 和 ET 模式核心差异在于通知时机:LT 反复通知直到读完,ET 只通知一次,Netty 选 ET 配合非阻塞 IO 达到高性能。
-
brk与mmap详解:malloc底层内存分配的双引擎
malloc 底层通过 brk 移动堆顶分配小块内存,通过 mmap 创建匿名映射分配大块内存,深刻理解双引擎对内存效率的影响。
-
责任链模式——从Servlet FilterChain到Spring Interceptor
Tomcat FilterChain 用迭代加 pos 索引替代递归避免栈溢出,Spring Interceptor 逆序补偿保证执行对称性。
-
观察者模式——Spring事件驱动架构的基石
观察者模式将硬编码调用链解耦为发布订阅网络,配合事务监听器和异步执行构建灵活的事件驱动架构。
-
装饰器模式——Java IO为什么是一层套一层的洋葱?
装饰器模式用组合替代继承实现功能叠加,Java IO 的洋葱模型用 N 加 M 个类覆盖 N 乘 M 种功能组合。
-
策略模式——Spring如何用Map注入消除if-else
Spring 通过@Autowired Map 注入收集所有策略实现,完全消除 if-else 分支,新增策略只需加 Component 类。
-
模板方法模式——JdbcTemplate如何把连接管理从业务代码中抽离
父类固定流程骨架,子类实现可变步骤,JdbcTemplate 将连接管理与异常翻译抽离为模板,回调只需写 SQL。
-
建造者模式——复杂对象构建的优雅之道
建造者模式用链式调用替代多参构造器,将必填参数通过构造函数强制传入,可选参数通过 setter 设置。
-
原型模式——对象克隆的深浅之道
原型模式通过克隆已有对象避免昂贵的构造过程,重点理解 Java 中浅拷贝与深拷贝的本质区别及 Cloneable 的实现细节。
-
单例模式的5种写法——从饿汉到枚举的演进
从饿汉到枚举的五种单例写法演进:饿汉安全、DCL 巧妙、静态内部类优雅、枚举防反射,每种写法有其适用场景。
-
工厂模式——Spring FactoryBean如何封装复杂Bean的创建
FactoryBean 将复杂 Bean 的创建逻辑封装到独立类中,getBean 返回产品而非工厂实例。
-
Spring事务——传播行为与@Transactional失效的6种场景
梳理 Spring 事务七种传播行为与@Transactional 失效的六种场景——同类 this 调用绕过代理、非 public 方法、异常被吞、未配 rollbackFor 等,根因归结为调用未经过 AOP 代理。
-
Spring Boot自动装配——@SpringBootApplication背后的秘密
拆解@SpringBootApplication 背后的自动装配全流程——@EnableAutoConfiguration 触发候选类加载,@Conditional 条件筛选约 150 个配置类,实现引入依赖即可用的约定优于配置。
-
Spring循环依赖——三级缓存的精妙设计
逐层剖析 Spring 三级缓存解决循环依赖的精妙设计——一级存成品、二级暴露半成品打破循环、三级用 ObjectFactory 延迟生成代理保证 AOP 代理唯一性,以及构造器注入为何无解。
-
Spring IoC容器——BeanDefinition到Bean实例的完整旅程
从 BeanDefinition 到 Bean 实例的完整旅程——解析配置生成元数据、BFPP 修改配方、反射实例化、依赖注入、BPP 链处理与 AOP 代理生成,理清 BFPP 与 BPP 的阶段性分离设计。
-
Spring AOP——JDK动态代理和CGLIB的核心区别
对比 JDK 动态代理与 CGLIB 的底层机制——JDK 依赖接口+反射调用,CGLIB 通过子类+FastClass 索引实现非反射调用,Spring Boot 2.x 为何强制默认 CGLIB。
-
RocketMQ延时消息的底层实现
揭开 RocketMQ 延时消息底层实现——Broker 拦截后存入 SCHEDULE_TOPIC_XXXX 内部 Topic,ScheduleMessageService 每秒轮询到期消息恢复投递,引起约 1 秒精度偏差。
-
RocketMQ 顺序消费:从队列路由到线程绑定的完整链路
梳理 RocketMQ 顺序消费的三环接力——生产者取模路由到同一队列、Broker FIFO 存储、Consumer 分布式锁+单线程绑定,以及 SUSPEND_CURRENT_QUEUE_A_MOMENT 的可靠性设计。
-
RocketMQ 消息领域模型:Topic、Tag、MessageQueue、Group 与 Offset 的层次设计
逐层拆解 RocketMQ 五层领域模型——Topic 命名空间、Tag 二级分类、MessageQueue 物理队列、ConsumerGroup 逻辑分组与 Offset 64 位指针,纠正七个常见误解。
-
RocketMQ 消息过滤:Tag 过滤、SQL92 表达式与过滤原理
解析 RocketMQ 三级过滤漏斗——Tag 哈希在 ConsumeQueue 层 O(1)过滤不读磁盘,SQL92 表达式需读 CommitLog 但有灵活性,消费端二次过滤作为最后防线防哈希冲突。
-
RocketMQ 消息积压处理:监控、流控、扩容与 DLQ 的全链路方案
消息积压从发现到消除的全链路方案——监控指标与告警阈值、生产者流控止血、消费端扩缩容与批量优化、DLQ 兜底毒消息,以及基于 Lag 的 K8s 自动弹性伸缩。
-
RocketMQ 消息幂等性:为什么 MessageId 不可靠,以及如何真正去重
剖析 RocketMQ 消息重复的三种来源与为什么 MessageId 不可靠,对比四种幂等方案——数据库唯一索引、Redis SETNX、业务状态机与 Broker 端去重,强调消费端是最后防线。
-
RocketMQ死信队列——16次重试后的最终兜底
解析 RocketMQ 死信队列作为 16 次重试后的最终防线——延迟递增重试策略防止资源浪费,DLQ 隔离毒消息保障正常流,人工介入修复后手动回放。
-
RocketMQ架构——为什么CommitLog所有Topic共用一份文件
剖析 RocketMQ 三个核心架构取舍——CommitLog 单文件顺序追加实现极致写性能,ConsumeQueue 固定 20 字节二级索引换一次随机读,NameServer 无主设计换零运维。
-
RocketMQ 延时消息原理:18 级延时与 SCHEDULE_TOPIC_XXXX 揭秘
拆解 RocketMQ 18 级延时消息的完整生命周期——从写入 SCHEDULE_TOPIC_XXXX 按 delayLevel 分 Queue,到 ScheduleMessageService 定时扫描投递,展示时间分桶替代独立计时的架构取舍。
-
RocketMQ 刷盘机制:同步刷盘、异步刷盘与顺序写磁盘
详解 RocketMQ 同步刷盘与异步刷盘的区别,深入 mmap 内存映射文件与顺序写磁盘如何实现高吞吐,以及 GroupCommit 组提交优化同步刷盘性能。
-
RocketMQ事务消息——Half Message的两阶段提交
拆解 RocketMQ 事务消息的 Half Message 二阶段提交机制——消息先写 RMQ_SYS_TRANS_HALF_TOPIC 不可见,本地事务执行后 Commit/Rollback,回查机制兜底网络丢包。
-
RocketMQ vs Kafka:性能、功能与适用场景的全维度对比
全维度对比 RocketMQ 与 Kafka 的性能、存储模型、功能矩阵与生态差异——为什么 Kafka 怕多 Topic,以及 sendfile 与 mmap 零拷贝实现的不同取舍。
-
RocketMQ ConsumeQueue 索引:20 字节条目如何精准定位消息
深入解析 ConsumeQueue 固定 20 字节索引条目的设计精妙——8 字节 CommitLog 偏移+4 字节大小+8 字节 Tag 哈希,实现 O(1)消息定位的二级索引体系。
-
缓存设计——穿透、击穿、雪崩的完整防御体系
缓存穿透用布隆过滤器拦截非法 key,击穿用互斥锁保证单线程回源,雪崩用 TTL 随机化分散过期时间。
-
布隆过滤器的双重哈希技巧
通过一次 MurmurHash3 调用的高低 32 位做线性组合,模拟 k 个独立哈希函数的效果。
-
布隆过滤器 vs 布谷鸟过滤器——为什么布隆过滤器不支持删除?
布隆过滤器位数组共享导致不可删除,布谷鸟过滤器用 XOR 可逆指纹实现双向定位与删除。
-
ZipList连锁更新到listpack——Redis压缩列表的演进
ZipList 的连锁更新问题根因在于变长编码依赖前驱节点,listpack 通过自描述编码彻底根除这一设计缺陷。
-
Redis渐进式rehash
揭示 Redis 如何通过 ht[0]/ht[1]双表+rehashidx 游标,将 O(n)全量迁移拆为 n 次 O(1)微步,在每次读写命令中顺带推进,配合 serverCron 毫秒级时间预算兜底。
-
Redisson分布式锁的Lua脚本实现
剖析 Redisson 如何用一段 Lua 脚本解决手写 SET NX EX 的三个经典坑——锁超时误删、不可重入与释放原子性,以及 WatchDog 自动续期机制。
-
Redis 缓存更新策略三大模式:Cache Aside、Read/Write Through、Write Back
对比 Cache Aside、Read/Write Through 与 Write Back 三种缓存更新模式的核心原理、一致性保证和适用场景,给出生产环境的选型决策树。
-
Redis 淘汰策略详解:LRU 与 LFU
对比 Redis 八种内存淘汰策略,重点剖析近似 LRU 随机采样算法与 LFU 对数计数器+时间衰减的精妙设计,以及三者关键参数调优指南。
-
Redis 大 key 处理:定义、排查与删除的完整指南
完整指南——从大 key 的定义、排查工具到安全删除,涵盖 UNLINK 异步删除与各数据类型分批删除的最佳实践。
-
Redis Sentinel选主——三轮打分机制详解
详解 Redis Sentinel 故障转移全流程,包括主观/客观下线判定、Raft 风格 Leader 选举与三轮打分选主机制,以及 min-slaves-to-write 脑裂防护。
-
Redis quicklist 详解:双向链表 + listpack 的混合结构
解析 quicklist 双向链表+ziplist/listpack 混合结构,如何兼顾链表快速头尾操作与压缩列表低指针开销,并将连锁更新控制在一个节点范围内。
-
Redis jemalloc 内存分配器:红黑树、线程缓存与 size class
详解 Redis 默认内存分配器 jemalloc 的四层架构——tcache 线程缓存、细粒度 size class、红黑树 extent 管理与延迟回收如何实现低碎片率。
-
Redis Stream——持久化的消息队列新选择
介绍 Redis Stream 消息队列——支持消费者组、ACK 确认与消息持久化,填补 List 和 Pub/Sub 在轻量级可靠消息场景的空白。
-
Redis SDS 与 embstr 的 44 字节阈值:从 sdshdr 到 jemalloc 分配链
从 SDS 五种头类型到 RedisObject,完整推导 embstr 的 44 字节阈值——如何精确填满 jemalloc 64 字节 bucket,实现一次 malloc 零指针开销。
-
Redis RDB和AOF持久化——bgrewriteaof子进程如何不丢数据
对比 Redis 三种持久化机制——RDB 快照、AOF 写后日志与混合持久化,解析 bgrewriteaof 子进程如何通过双缓冲区不丢数据。
-
Redis GEO 地理位置:GeoHash 编码与 Sorted Set 的优雅结合
揭示 Redis GEO 基于 Sorted Set 的实现原理——GeoHash 将二维经纬度编码为 52 位整数,利用 ZRANGEBYSCORE 实现高效地理位置范围查询。
-
Redis Cluster无感扩容——MOVED和ASK重定向
剖析 Redis Cluster 在线扩容核心机制——slot 粒度的在线迁移与 MOVED/ASK 重定向,实现业务无感知的集群水平扩展。
-
MySQL 自适应哈希索引(AHI):BufferPool 内的自动加速器
AHI 在 BufferPool 中自动构建哈希表加速高频等值查询,键映射到叶子页而非行,范围查询不触发,高并发写入场景建议关闭
-
MySQL 索引下推(ICP):让二级索引在引擎层就完成过滤
ICP 将 WHERE 条件中索引列判断下推到存储引擎层减少回表,覆盖索引自动跳过 ICP,与 MRR 配合先过滤再排序批量回表
-
MySQL并行回放MTS
MTS 多线程并行回放解决主从延迟,LOGICAL_CLOCK 基于事务提交时间戳判依赖,单库场景优于仅按 Schema 并行的 DATABASE 模式
-
MySQL 存储引擎架构五层模型:表空间→段→区→页→行
InnoDB 五层存储架构表空间段区页行,页为 16KB 最小 IO 单元含 Page Directory 二分查找,区为 1MB 连续空间分配的基本单位
-
MySQL半同步复制——主库宕机后数据不丢失的保障
半同步复制 after_sync 模式主库等至少一个从库 ACK 写入 relay log 后才返回成功,超时降级异步防阻塞,主库宕机不丢已确认数据
-
MySQL两阶段提交与崩溃恢复
MySQL 内部 2PC 协调 redo 与 binlog 双日志一致性,binlog 完整则提交否则回滚,XID 贯穿两端,组提交多事务合并一次 fsync
-
MySQL联合索引——最左前缀与索引下推
联合索引最左前缀是 B+树多字段排序的物理结果非人为限制,范围查询后列失效因跨值后不再全局有序,ICP 可减少回表
-
MySQL深分页优化——LIMIT 100000,10为什么这么慢
深分页慢因 offset 大导致大量回表 IO,延迟关联让扫描在索引层完成免回表,游标分页用索引定位替代 offset 实现恒定性能
-
MySQL临键锁的退化规则
InnoDB 行锁三件套:临键锁等值查询加唯一索引时触发退化,记录存在变记录锁释放间隙,不存在变间隙锁防幻插
-
MySQL JOIN优化——NLJ、BNL、BKA与索引失效全景
JOIN 四种算法从 Simple NLJ 到 BKA 演进,被驱动表 JOIN 列加索引是小表驱动大表前提,六种常见索引失效场景需规避
-
MySQL Change Buffer:非唯一二级索引的写入加速器
Change Buffer 缓存非唯一二级索引变更将随机 IO 转顺序写,仅限于非唯一索引因唯一性检查必须读索引页,写后立即查询是反模式
-
MySQL Undo Log 详解:回滚段、MVCC 版本链与长事务之殇
Undo Log 双重使命:事务回滚与 MVCC 版本链构建,长事务导致 undo 膨胀根因是活跃 ReadView 阻止 purge 线程清理旧版本
-
MySQL MVCC——ReadView的四个字段如何决定可见性
ReadView 四字段可见性判断算法:遍历 undo 版本链比较 trx_id 与 m_ids 边界,RC 每次重建 ReadView,RR 复用至事务结束
-
MySQL MHA 故障切换与脑裂防护:从 STONITH 到 VIP 切换
MHA 故障切换五阶段时间线、STONITH 物理断电防脑裂、VIP 漂移三层防护,secondary_check_script 多路径验证防误切
-
MySQL GTID——为什么比binlog position更可靠
GTID 用 UUID 加事务序号作逻辑标识替代物理偏移,从库自动求差集续接,主从切换无需手动指定 binlog 文件和位置
-
MySQL EXPLAIN——执行计划每个字段的完整解读
EXPLAIN 字段解读:type 访问类型从 const 到 ALL 逐级变差,key 看实际使用的索引,Extra 中 Using filesort 需优先优化
-
MySQL InnoDB的BufferPool——分区LRU与Double Write
InnoDB 分区 LRU 防全表扫描污染 young 区热数据,Double Write 先顺序写 dblwr 备份再离散写数据文件防止页断裂
-
volatile的内存屏障——为什么DCL必须volatile
volatile 通过内存屏障保证可见性与有序性,禁止指令重排序是 DCL 安全实现的关键,深入理解 StoreLoad 等四大屏障。
-
Unsafe类——JUC所有无锁结构的原子操作基石
Unsafe 提供 CAS 原子操作、内存屏障和直接内存访问三类底层能力,是 JUC 所有无锁并发结构的基石。
-
TransmittableThreadLocal:跨线程池的上下文传递
阿里巴巴 TTL 通过装饰任务实现线程池场景下的上下文无损传递,解决 ThreadLocal 和 InheritableThreadLocal 的线程复用污染问题。
-
ThreadLocal内存泄漏的完整链路
ThreadLocal 的弱引用 key 被 GC 回收后 value 仍无法释放,详解内存泄漏完整链路及 get/set/remove 的过期清理机制。
-
ScheduledThreadPoolExecutor:定时任务调度的正确打开方式
分析 Timer 单线程设计的三个致命缺陷,对比 ScheduledThreadPoolExecutor 基于 DelayedWorkQueue 最小堆的多线程调度架构,以及 fixed-rate 与 fixed-delay 两种模式的核心区别。
-
MDC的ThreadLocal泄漏与ScopedValue
MDC 底层双 ThreadLocal 缓存设计原理,虚拟线程下 ThreadLocal 强引用 Value 导致泄漏,ScopedValue 作用域绑定自动释放
-
LongAdder vs AtomicLong——高并发下的Cell分槽与伪共享
LongAdder 通过 Cell 数组分槽降低 CAS 竞争,@Contended 消除伪共享保证分槽独立性,以 sum()最终一致性换高并发写入性能
-
Java线程池——execute()为什么入队后要做二次检查?
线程池 execute()入队后二次检查:防无线程消费队列与 shutdown 时任务悬空,保证竞态场景下任务语义一致
-
ForkJoinPool分治并行:工作窃取与双端队列
ForkJoinPool 用不对称双端队列实现工作窃取:自身 LIFO 取最新 Fork 保留缓存局部性,偷取者 FIFO 从栈底取大粒度任务实现负载均衡。
-
CountDownLatch、CyclicBarrier、Semaphore——三大并发工具辨析
CountDownLatch 一次性倒计数适合主等子,CyclicBarrier 可重置栅栏适合多阶段同步,Semaphore 控制并发数适合限流与连接池。
-
CompletableFuture——异步编程的链式编排
CompletableFuture 用 thenApply/thenCombine 链式编排异步任务,但默认共用 ForkJoinPool.commonPool,IO 密集任务须自定义线程池避免阻塞共享资源。
-
AQS——JUC所有锁的共同底座
AQS 将阻塞、排队、唤醒抽离为抽象基类,子类只需定义 tryAcquire/tryRelease 语义,实现锁与同步器的统一底座。
-
Java线上排查——从top到Arthas的完整工具链
从 top 定位 CPU 到 Arthas trace 精准定位方法耗时,构建 Java 线上排查的五场景完整工具链。
-
synchronized锁升级机制
synchronized 根据竞争程度自动升级:无锁→偏向锁→轻量级锁→重量级锁,通过 Mark Word 编码锁状态实现无竞争零开销。
-
happens-before规则详解:JMM的8条核心约束
JMM 的 8 条 happens-before 规则定义了多线程下变量修改的可见性保证,是理解 volatile、锁、并发工具的前提。
-
OOM类型全景排查——从heap到direct memory的四种溢出路径
四种 OOM 全景排查:堆 OOM 用 MAT 支配树找泄漏源、元空间查 ClassLoader、栈溢出看递归、直接内存手动 cleaner 释放
-
JVM运行时数据区——每个字节码在哪里执行?
JVM 运行时区分为线程共享的堆与元空间、线程私有的虚拟机栈与 PC 寄存器,不同 OOM 类型精确对应各自所属内存区域。
-
JVM三色标记与漏标问题
三色标记中漏标的充要条件是黑色对象新增白引用且灰色到白引用被删,CMS 用写后屏障增量更新,G1 用写前屏障 SATB 保留快照。
-
JVM指针压缩:32位地址访问32GB堆的魔法
利用对象 8 字节对齐低 3 位恒零,将 64 位地址右移 3 位压缩为 32 位存储,解码时左移恢复,4 字节指针寻址 32GB 堆。
-
JVM对象创建与生命周期:从new指令到GC回收
new 指令触发类加载检查、TLAB 无锁分配、零值初始化、设置 Mark Word 与 Klass Pointer 对象头,经历 Eden→Survivor→Old 三代晋升至 GC 回收。
-
JVM ShenandoahGC:Brooks Pointer与并发转移
Shenandoah 用对象头前 Brooks 转发指针实现并发转移,应用线程每次读引用经过转发指针跳转,CAS 更新实现转移与访问的原子同步。
-
JVM Epsilon回收器:什么也不做的GC
Epsilon GC 只分配不回收,消除 GC 变量后可用于 JMH 基准测试、测量 GC 真实开销、通过二分 OOM 边界确定应用精确内存需求。
-
JIT编译与逃逸分析——JVM如何让你的Java代码越跑越快?
C2 逃逸分析将未逃逸对象做标量替换免除堆分配,连带触发锁消除,方法内联为优化提供更大上下文,让 Java 代码越跑越快。
-
GraalVM-Native-Image-AOT编译四阶段
Native Image 通过指针分析删死代码、堆快照预计算 Spring 初始化、AOT 编译为机器码,将启动从 12s 压缩到 0.2s。
-
G1垃圾回收器——Region、RSet和SATB
G1 将堆切为 2048 个 Region 动态分代,RSet 记录跨 Region 引用避免全堆扫描,SATB 保留快照保证并发标记不丢对象。
-
虚拟线程的Pinning问题
synchronized 的 Monitor 锁与 OS 线程绑定导致虚拟线程无法卸载,替换为 ReentrantLock 可彻底解决 Pinning 问题。
-
Stream惰性求值——为什么中间操作不会立刻执行?
揭示 Stream 惰性求值机制——中间操作只构建 Pipeline 链表不执行,终止操作触发 Sink 链构建后每个元素一次性穿越所有中间操作,配合短路操作提前终止遍历。
-
Lambda的invokedynamic与匿名内部类
Lambda 通过 invokedynamic 运行时动态生成类,无捕获时为单例,与编译期生成.class 的匿名内部类本质不同
-
Java 21 结构化并发:让虚拟线程如虎添翼
StructuredTaskScope 将子任务生命周期限定在 try-with-resources 花括号内,任一失败全员取消,与虚拟线程配合实现廉价海量并发无泄漏。
-
Java Record与Sealed类——代数数据类型(ADT)的语言级支持
Record 一行声明不可变数据类编译器自动生成全套方法,Sealed 限制子类集合配合 switch 模式匹配实现编译期穷举检查消除漏分支。
-
HashMap的哈希扰动与扩容机制
HashMap 用 h^(h>>>16) 扰动让高位参与桶定位,扩容时 hash&oldCap 一次位运算决定节点去留,尾插法消除 JDK7 死循环。
-
ConcurrentHashMap——从JDK7分段锁到JDK8桶级锁
JDK 8 ConcurrentHashMap 以桶头节点 synchronized + CAS 空桶替代 JDK 7 分段锁,多线程协助扩容,ForwardingNode 让读操作对扩容透明。
-
ArrayList与CopyOnWriteArrayList——1.5倍扩容与fail-fast机制
ArrayList 1.5 倍扩容与 fail-fast 迭代器的 modCount 检测机制,CopyOnWriteArrayList 以写时复制数组实现读无锁写安全。
-
注解原理——@Override背后有一个动态代理
注解本质是继承 Annotation 的接口,运行时通过 JDK 动态代理将 class 文件属性表中的值映射为方法返回值。
-
Java泛型类型擦除——编译器为什么要生成桥接方法?
泛型擦除后多态调用断裂,编译器自动生成桥接方法作为 JVM 与泛型之间的翻译层修复方法签名不匹配。
-
Java序列化——反序列化为什么用Unsafe.allocateInstance绕过构造器?
反序列化通过 Unsafe.allocateInstance 绕过构造器恢复对象状态,同时也带来了 RCE 安全风险。
-
Java反射——Inflation机制让反射接近直接调用
反射调用前 15 次走 Native JNI,之后 Inflation 机制动态生成字节码实现接近直接调用的性能,深刻理解反射的慢与优化。
-
享元模式——IntegerCache与String常量池的共享之道
享元模式通过共享减少对象创建,IntegerCache 和 String 常量池是 JDK 源码中最经典的应用实例。
-
hashCode与equals的契约——为什么重写equals必须重写hashCode?
equals 相等的对象 hashCode 必须相等,违反这条契约 HashMap 的 get 就找不到 key,详解散列桶定位的底层逻辑。
-
String、StringBuilder、StringBuffer 深入对比:从字节码到 JMH 性能
从 JDK 9 Compact Strings 的 byte[]+coder 机制到扩容策略与 javac+号编译优化,再到 JMH 性能数据对比,给出三者的完整选型决策树。
-
Java异常表的零开销机制
try-catch 编译为 class 文件末尾异常表而非内联代码,正常路径字节码零痕迹真零开销,finally 靠编译器在所有出口复制代码实现。
-
Java四种引用类型——强软弱虚与Cleaner的堆外内存释放链
软引用 OOM 前回收适用内存敏感缓存,弱引用随 GC 清除为 ThreadLocal 键,虚引用加 Cleaner 链表实现堆外内存精确延迟释放。
-
IntegerCache——为什么Integer 127 == Integer 127是true而128不是?
Integer 自动装箱走 valueOf 享元缓存 -128~127 内对象,== 比引用非值 equals 才是正确比较,三元运算类型推断可能触发 NPE 拆箱。
-
Compact Strings——JDK 9如何将String内存占用减半?
JDK 9 用 byte[] 替代 char[] 加 coder 标志位实现紧凑字符串,纯 ASCII 内存减半,coder 被 JIT 内联消除分支无运行时开销。
-
ByteBuffer——HeapByteBuffer与DirectByteBuffer的本质区别
HeapByteBuffer 在 IO 路径多一次堆内到堆外拷贝,DirectByteBuffer 直通内核但依赖 Cleaner 虚引用释放,有隐蔽的堆外内存泄漏风险。
-
BigDecimal——为什么0.1+0.2不等于0.3?
IEEE 754 二进制浮点无法精确表示 0.1,BigDecimal 用十进制定点数模型消除精度误差,金额计算严禁用 double 构造器。
-
BIO的ServerSocket.accept()——从Java到内核的完整调用链
从 Java ServerSocket.accept() 出发,穿透 JNI/libc 直达内核 sys_accept,完整展现一次 BIO 阻塞的六层调用链。
-
后端学习路线
一份面向初学者的后端技术学习指南,详细梳理了 Java 后端开发所需的基础语言、核心框架、中间件系统以及开发工具的学习顺序与心得。