引用计数(Reference Counting)是一类以“被引用次数”管理对象生命周期的内存管理方法。对象每多一个持有者,计数加 1;持有者释放,计数减 1;计数归零时立即回收。它常见于需要确定性释放资源的场景,例如文件句柄、网络连接、图形对象、音视频缓冲区等。 核心机制:计数、持有、释放、回收 引...
Java 的“引用类型”传到 C++,本质不是把 Java 对象“搬进”C++ 堆里,而是把“可定位到该对象的句柄”交给 native 侧。内存管理因此变成三套机制的交界:JVM 垃圾回收(GC)、JNI(或 JNA/JavaCPP 等封装)的引用语义、C/C++ 的手动资源管理。把这三者的边界画清...
TCP 的“可靠”,本质是把不可靠的 IP(尽力而为、可能丢包/乱序/重复)之上,叠出一套可验证、可纠错、可收敛的传输机制:能发现问题、能重传修复、能按序交付、还能在拥塞与接收能力边界内维持稳定吞吐。 可靠性的定义边界:TCP 到底保证什么 TCP(Transmission Control Prot...
Spring Bean 的生命周期本质是一条“从定义到实例、从装配到可用、从托管到销毁”的流水线。不同配置方式(XML、注解、Java Config)只影响“如何得到 BeanDefinition(Bean 定义)”,不改变核心阶段;不同作用域(scope)会显著改变“创建次数与销毁时机”。 从定义...
MySQL 的事务隔离级别(Transaction Isolation Level)用于规定“一个事务在执行过程中,能看到其他并发事务到什么程度的数据变化”。隔离越强,并发副作用越少,但开销与等待通常越多。MySQL/InnoDB 支持并实现了标准的 4 个级别。 四种隔离级别一览 READ UNC...
int 是否需要做 cache line 对齐,取决于它的“使用方式”而不是类型本身。单个 int 几乎从不需要对齐到缓存行;真正需要处理的是“多个线程频繁写入、且这些写入的变量落在同一条缓存行里”的场景,这会触发 伪共享(false sharing)。 伪共享发生的条件:不是“共享变量”,而是“共...
在 10 万个数里取最小的 10 个,本质是做一次“保留候选集合”的筛选:只需要维护一个容量固定为 10 的集合,随着数据流入不断淘汰其中的最大者,最后留下的就是全局最小的 10 个。 这里用“小顶堆”的常见做法是把数值取相反数,借助小顶堆实现“最大堆”的效果。 思路:用小顶堆模拟固定容量的最大堆 ...
事务并发读写时,数据表面上“多出/少出了一批行”的现象,通常称为幻读。它的关键不在于某一行的值被改了(那更像不可重复读),而在于同一个查询条件在同一事务内前后两次执行,第二次读到的行集合(结果集)发生了变化,像是出现了“幻影行”。 现象长什么样:结果集变了 幻读最典型的触发方式是范围查询或“按条件取...
在“基本有序、只有少量元素错位”的场景里,插入排序通常最快,工程上也最常被当作这类输入的首选。 为什么插入排序在“几乎有序”时会赢 插入排序的核心动作是:从左到右扫描,把当前元素插入到前面已经有序的子序列里。它的代价几乎完全由逆序对(inversion,指一对元素相对顺序颠倒)数量决定。 当数组接近...
ScheduledThreadPoolExecutor(JDK 中最常用的 Scheduled 线程池实现)本质是“定时任务调度器 + 固定/可扩展工作线程”的组合:用一个按触发时间排序的延时队列保存任务,用若干工作线程不断取出“到期任务”执行;对周期任务,再计算下一次触发时间并重新入队。它不是靠“...