本文系统阐述了 Redis 的持久化机制与主从架构。首先介绍 RDB 快照(save、bgsave)及其写时复制原理,并对比同步的 save 与异步的 bgsave 的优缺点;随后详细说明 AOF 追加日志、fsync 策略及 AOF 重写过程,比较 RDB 与 AOF 的体积、恢复速度和数据安全性,并提出在生产环境中可同时开启两者或使用 Redis 4.0 的混合持久化以兼顾恢复速度和完整性。接着给出基于 crontab 的备份方案。随后展示了主从复制的搭建步骤、全量与增量(PSYNC)同步原理以及防止复制风暴的优化思路。最后提供 Jedis 连接示例,演示管道(Pipeline)批量请求和 Lua 脚本的原子操作,说明其在降低网络开销和实现事务功能方面的优势。

G1是服务器级分代收集器,将堆划分为Region,按停顿目标优先回收,支持并行、复制算法及大对象Humongous,适合8GB以上、停顿≤500ms场景;可调参数如‑XX:MaxGCPauseMillis、‑XX:G1HeapRegionSize等。ZGC是JDK11引入的低延迟单代收集器,采用Region、颜色指针和读屏障,实现并发标记‑重分配‑自愈,停顿≤10ms,支持TB堆并感知NUMA。

文章先介绍JVM整体结构和内存模型,解释Minor GC时对象复制后根引用如何指向新地址。随后系统阐述常用JVM参数含义及调优方式,如‑Xms/‑Xmx/‑Xmn/‑Xss、MetaspaceSize 与 MaxMetaspaceSize,并给出Spring Boot 启动示例。通过递归导致的StackOverflowError演示‑Xss 对栈深度的影响。最后提出调参原则:尽量让对象在新生代分配回收,避免频繁晋升老年代,并根据业务负载合理分配堆与元空间大小。

选择排序把数组分为已排和未排两部分,每轮在未排区找最小元素并与当前位置交换。代码实现以 i 为目标索引,遍历找最小索引 s,最后一次交换,以减少交换次数。时间复杂度 O(n²),交换次数少于冒泡,若序列已有序度高则冒泡更快。选择排序不稳定,示例用扑克牌对象比较,冒泡保持相同键的相对顺序,选择排序可能改变其相对位置。

冒泡排序通过相邻元素比较并交换,使最大值逐轮“冒”至数组末端,直至整体有序。文章先阐述概念并示例演示第一轮结果,随后给出实现思路:外层循环控制轮数,内层比较相邻元素并记录是否交换。提供了一个简单版 Java 实现(含 swap 方法和提前终止的 swapped 标记),并指出代码中循环变量的错误。随后介绍优化方案:记录每轮最后一次交换位置 last,作为下一轮比较上界;若 last 为 0 则数组已排好序,可提前退出。优化版代码展示了该思路,并通过逐轮输出验证排序过程。全文概括了冒泡排序的原理、基本实现及常用优化技巧。