知其然,知其所以然
Git 内部原理 2026-09-22

Git gc 到底做了什么:一个文件真实改 31 次,松散对象是怎么被压缩、清理掉的

真实对同一个大文件连续提交 31 次小改动,真实测出 git gc 之前 .git/objects 有 93 个松散对象、占 496K,gc 之后只剩 1 个 pack 文件、占 36K;用 git verify-pack -v 真实看穿 pack 内部的 delta 链,揪出一个反直觉的细节——某个 blob 在 verify-pack 输出里显示只有 38 字节,但 git cat-file -s 一查,真实内容其实是 116321 字节,38 字节只是变成这一版所需的增量指令大小;真实验证删除分支后悬挂的 commit 对象,在默认宽限期内还能用哈希读到,强制清空 reflog 并立即 gc 之后,同一个哈希真实读取失败,对象被真正清理掉了。

pack文件 垃圾回收
Java 内部原理 2026-09-22

实例初始化块真实验证:执行顺序真实是父类块→父类字段→父类构造器→子类块→子类字段→子类构造器

真实记录Derived继承Base,各自都有实例初始化块、字段初始化、构造器时的真实完整执行顺序;真实验证同一个类里多个初始化块和字段初始化真实严格按源码书写顺序交替执行。

Java 类初始化 继承 动画演示
Kubernetes 2026-09-21

RBAC 鉴权:一条规则到底是怎么匹配上一次请求的

本机真实 Go 程序(逐字符转录自 kubernetes v1.37.0 真实源码,本机真实编译执行)验证 PolicyRule 的四重匹配逻辑、NonResourceURL 通配符的裸字符串前缀匹配陷阱、RoleBinding 引用 ClusterRole 时授权范围被收窄到单一命名空间的机制,以及 RBAC 没有拒绝语义、只有允许取并集的真相,对照真实源码。

RBAC 鉴权 动画演示
Docker 容器原理 2026-09-21

镜像分层与构建缓存:一条 COPY 指令怎么变成一层,缓存在什么粒度失效

真实构建多层 FROM scratch 镜像,本机真实实测每条 COPY 指令怎么变成 docker history 里独立的一层、ENV/LABEL/ENTRYPOINT 这些元数据指令是真实的 0 字节层、原样重建全部命中缓存、改中间一条 COPY 的源文件会让它自己和后面所有层全部失效重建而前面的层不受影响,对照 OCI 镜像规范里层按顺序叠加的定义。

镜像分层 构建缓存 动画演示
Git 内部原理 2026-09-21

Git 分支的本质:创建一个分支,.git/objects 里到底多了几个对象

真实建两次提交后创建分支,现场数出 .git/objects 对象总数创建前后完全没变(6→6),分支文件本身只有 41 字节;真实验证分支 ref 文件里就是一个 40 位提交哈希加换行符,不是什么特殊结构;在新分支上真实再提交一次,证明 main 分支的 ref 文件内容一字未动;真实对比普通分支和 detached HEAD 下 .git/HEAD 文件内容的区别;真实删掉一个分支后,用它原来指向的哈希直接 cat-file,证明底层 commit 对象根本没被删,只是没有引用再指着它了。

分支模型 refs
Java 内部原理 2026-09-21

AtomicReference真实复现ABA问题:值改回来了,CAS真实浑然不知

真实用两个线程复现ABA问题:threadA把AtomicReference<Integer>的值从100改成50再改回100,threadB用最初读到的100做CAS(999)真实依然成功;真实意外发现超出Integer缓存范围时单线程内CAS都会因自动装箱产生不同对象实例而真实失败;真实验证AtomicStampedReference靠版本戳真正解决了ABA问题。

Java 并发 CAS 动画演示
Gin 框架内部原理 2026-09-20

Gin 参数绑定:ShouldBind 怎么根据 Content-Type 自动选择解析器,又是怎么校验的

本机真实 Go + gin-gonic/gin v1.12.0 程序验证 binding.Default 的 Content-Type 分发逻辑与两个边界情况、binding/validate 的 tag 名字陷阱、解析与校验的严格分步、以及校验引擎懒初始化的并发安全性,对照真实源码。Gin 框架内部原理系列(路由树→中间件→Context 池→参数绑定)完结。

参数绑定 反射 动画演示
Docker 容器原理 2026-09-20

Cgroups:--memory 限制是不是真的生效,真实吃内存到被 OOM Kill

真实构建 FROM scratch 容器镜像,本机真实实测 --memory/--cpus 最终写进 cgroup v2 的 memory.max/cpu.max 文件、一个真实吃内存的程序在限制下被真实 OOM Kill(退出码 137)、--cpus=0.25 真实测出的耗时不是理论上的 4 倍而是约 6 倍,用真实的 cpu.stat 节流计数解释原因,对照 runc 依赖的 cgroups 库真实源码。

Cgroups OOM 动画演示
Git 内部原理 2026-09-20

Git 是怎么给内容去重的:两个路径不同、内容相同的文件,.git 里真的只存一份

真实建两个路径不同、内容完全相同的文件提交进 git,真实数出 .git/objects 目录只多了一份 blob,不是两份;手动用 zlib 解压这个 blob 文件、重新计算一遍 SHA-1,现场验证文件名(哈希)就是内容本身算出来的,不是随便分配的编号;手动按字节解析 tree 对象的二进制格式,还原出 mode/文件名/20 字节原始哈希;真实只改 1 个字节,新哈希跟旧哈希完全不沾边,并且真实数出这个改动会牵连从这层文件到根目录一路上的几个 tree 对象跟着变,没改的兄弟文件全部复用旧对象。

Git对象模型 SHA-1
Java 内部原理 2026-09-20

Lock+Condition真实验证:同一把锁开两个Condition,signal真实只唤醒对应的那一组

真实用一个ReentrantLock创建notEmpty和notFull两个独立Condition,各挂起5个等待线程;真实调用notEmpty.signalAll()后,notEmpty组真实全部被唤醒(5),notFull组真实一个都没动(0);真实验证未持有锁时调用Condition.await()真实抛出IllegalMonitorStateException。

Java 并发 Lock 动画演示
Gin 框架内部原理 2026-09-19

Gin Context 对象池:sync.Pool 怎么把每次请求的 Context 复用起来的

本机真实 Go + gin-gonic/gin v1.12.0 程序验证 Context 在连续请求间真实复用同一块内存、GC 后可能被清空、reset() 真正隔离每次请求的数据、高并发下的安全性(-race 验证),并用真实基准测出禁止复用会多花约 2.2 倍内存,对照真实源码。

sync.Pool 性能 动画演示
Docker 容器原理 2026-09-19

Linux 命名空间:同一个进程,为什么宿主机和容器内部看到的 PID 不一样

真实构建 FROM scratch 容器镜像(本机交叉编译静态二进制,不依赖任何网络拉取),本机真实实测 PID/UTS/网络命名空间隔离:两个并发容器拿到不同的真实 IP,同一个操作系统进程在宿主机视角和容器内部视角报告完全不同的 PID,--pid=host 关闭隔离后立刻现出真实 PID,对照 runc 真实源码里命名空间类型到内核 clone 标志位的映射。

命名空间 PID 动画演示
京ICP备2026067502号-1京公网安备11010502063487号