底层剖析

5 篇文章
为什么 MySQL 选择使用 B+ 树作为索引结构?

为什么 MySQL 选择使用 B+ 树作为索引结构?

数据库索引的核心需求是加速数据查找,同时减少磁盘 I/O 次数和支持范围查询、排序等常见场景。B+ 树作为数据库索引的核心结构,因其多路平衡查找树的特性,能够有效减少磁盘 I/O,支持高效的范围查询和排序,且查询效率稳定。相比其他数据结构(如哈希表、红黑树、B 树),B+ 树在磁盘 I/O 次数、范围查询支持、空间利用率等方面具有明显优势。 B+ 树的主要特性包括:1)层级低,磁盘 I/O 少;2)数据集中在叶子节点,查询效率稳定;3)叶子节点有序且通过双向链表连接,完美支持范围查询、排序和分页;4)空间利用率高,进一步降低树的高度。 MySQL 的 InnoDB 存储引擎对 B+ 树做了进一步优化,如聚簇索引、页缓存和自适应哈希索引,以更好地适应实际业务场景。总的来说,B+ 树因其低 I/O 成本、场景适配性强、效率稳定和空间利用率高,成为关系型数据库索引的“事实标准”。

Java面试-22:HashMap 的原理?

Java面试-22:HashMap 的原理?

HashMap 是一种基于数组和链表(或红黑树)的数据结构,通过 key 的 hash 值定位桶位置。数组初始长度为 16,负载因子为 0.75,当元素达到 12 个时会扩容以避免性能下降。key 的 hash 值经过扰动运算后用于定位桶位置,采用位运算而非取模以提高效率。链表长度超过 8 且数组长度大于等于 64 时,链表会转换为红黑树以优化查询性能。put 操作流程包括计算 hash、定位桶、插入元素并判断是否扩容,而 get 操作则是反向查找。HashMap 在多线程环境下可能导致环形链表,因此是非线程安全的,建议在并发场景下使用 ConcurrentHashMap。

SpringBoot 的启动流程

SpringBoot 的启动流程

Spring Boot 应用启动过程包括多个步骤:首先,寻找带有 `@SpringBootApplication` 注解的启动类,并在其中执行 `main()` 方法。随后,实例化 `SpringApplication` 对象,设置应用参数(如是否显示 banner 或以 web 环境启动)。接着,调用 `SpringApplication.run()` 启动应用,准备环境并解析配置文件。之后,创建并刷新应用上下文,注册所有 Bean,包括自动配置的 Bean。应用启动监听器和初始化器执行自定义逻辑,自动配置机制根据类路径和配置属性自动配置应用。如果是 web 应用,启动内嵌服务器。启动完成后,执行 `CommandLineRunner` 和 `ApplicationRunner` 接口的 Bean,最终应用进入运行状态,准备接受请求。

SpringBoot 是如何实现自动配置的?

SpringBoot 是如何实现自动配置的?

SpringBoot 的自动配置基于“约定大于配置”的思想,通过多个关键机制实现。启动时,SpringBoot 会扫描 `classpath` 下的 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 文件,加载其中的自动配置类。这些类通过条件注解(如 `@ConditionalOnClass`、`@ConditionalOnMissingBean`)确保仅在满足特定条件下生效。例如,引入 `spring-boot-starter-data-redis` 时,自动配置会检测到 `LettuceConnectionFactory` 类,并在未创建 `RedisTemplate` 时自动配置连接池和模板对象。自动配置类通常存在于 `spring.factories` 或 `AutoConfiguration.imports` 中,条件装配避免冲突,配置优先级可通过 `@AutoConfigureAfter` 控制。`@EnableAutoConfiguration` 注解是触发整个自动配置链路的开关,许多第三方库(如 Nacos、MyBatis-Plus)也遵循这一模式,简化了初始化配置。

Java 中的垃圾回收算法

Java 中的垃圾回收算法

本文详细介绍了五种核心垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集和分区收集。标记-清除算法通过标记存活对象并清除未标记对象,简单但会产生内存碎片;标记-复制算法将存活对象复制到新区域,无碎片但内存利用率低;标记-整理算法在标记后整理存活对象,无碎片但耗时较长。分代收集根据对象存活周期分为新生代和老年代,分别采用标记-复制和标记-整理算法。分区收集则通过划分区域减少单次GC停顿时间,适用于大内存应用。各算法的优缺点和适用场景在对比表中清晰呈现。总体而言,垃圾回收算法的目标是高效回收垃圾、减少内存碎片和GC停顿时间。