文章首先介绍了 Java7/8 中 HashMap 的内部结构:数组 + 单向链表的 Bucket,阈值、负载因子和容量始终保持 2 的幂;阐述了 put 的关键步骤——初始化数组、计算 hash、定位下标、判重、必要时扩容并迁移节点,以及 get 的简洁实现。随后对 ConcurrentHashMap 进行解析,说明其由固定数量的 Segment(默认 16)组成,每个 Segment 类似独立的 HashMap 并通过 ReentrantLock 实现分段锁;详细说明了初始化时对并发级别、容量和负载因子的处理,以及 put 操作中通过高位 hash 定位 Segment、按需初始化 Segment 并在内部完成线程安全的插入。整体对两者的实现细节和并发策略作了对比说明。

对象创建首先检查new指令对应的类是否已加载、解析、初始化;随后在堆中为实例分配内存,常用“指针碰撞”(Bump‑the‑Pointer)或“空闲列表”(Free‑List)方式,并通过CAS或Thread‑Local Allocation Buffer(TLAB)解决并发竞争。分配后将内存清零、设置对象头(包含哈希、GC年龄、锁状态、类型指针等)并执行构造函数完成初始化。JVM 采用压缩指针(CompressedOops/CompressedClassPointers)以降低 64 位平台的内存占用,并通过对象对齐填充提升访问效率。针对短生命周期对象,逃逸分析与标量替换可将其在栈上分配,减少堆分配和 GC 压力。

本文以 Spring Cloud Alibaba 为例,演示微服务项目的搭建流程。首先创建 Maven 父工程 cloud2021,统一管理 Spring Boot 2.2.2、Spring Cloud Hoxton.SR1、Alibaba 2.1.0 等依赖及版本。随后在父工程下新增支付服务模块 cloud-provider-payment8001,编写子模块 pom,引用公共 api 包、Spring Web、Actuator、MyBatis、Druid、MySQL 等必要组件。通过 application.yml 配置服务端口、Spring Application 名称、Druid 数据源属性及 MyBatis 扫描路径,完成数据库连接和实体映射。最后提供 PaymentMain8001 启动类,实现服务的快速启动。全文覆盖从父工程结构、依赖管理到子模块配置的完整实战步骤。

JVM 在运行 Java 程序时,首先通过类加载器把主类加载进内存,加载过程包括 加载‑验证‑准备‑解析‑初始化 五步。加载阶段读取字节码并生成 java.lang.Class 对象;验证检查字节码合法性;准备为静态字段分配默认值的内存;解析将符号引用转为直接引用;初始化执行静态代码块并赋予真实值。JVM 共有四类加载器:启动类加载器负责加载 JRE lib 目录下的核心库,扩展类加载器加载 ext 目录的 JAR,应用类加载器加载 CLASSPATH 下的用户类,用户可自行实现自定义加载器。类加载采用双亲委派模型:子加载器先委托父加载器查找,父未找到再由子自行加载,确保核心类优先由启动加载器完成。示例代码演示了类的延迟加载、不同加载器的层次结构以及 ClassLoader.loadClass 实现的委派逻辑。

本文示例演示了在Spring Boot项目中集成Mybatis‑Plus实现对MySQL表tbl_employee的增删改查。步骤包括:创建数据库及示例数据;使用Spring Boot初始化项目并引入Lombok、Mybatis‑Plus、MySQL、Druid等依赖;在application.yml中配置数据源;编写使用@TableName、@TableId、@Version注解的实体类User;创建继承BaseMapper的UserMapper;提供完整的pom.xml;通过JUnit测试类使用@MapperScan进行查询、插入、更新、删除等CRUD操作,验证Mybatis‑Plus的简化功能。

本文详细演示了在已装 Docker 的服务器上,使用 Docker 部署单节点 Elasticsearch(7.12.1)和 Kibana(7.12.1),包括创建网络、加载镜像、配置容器参数及端口映射。随后通过 MyBatis‑Plus 编写 Java 示例,批量查询 MySQL 中的 hotel 表数据,转换为文档并使用 RestHighLevelClient 的 BulkRequest 将其写入 Elasticsearch 索引。最后在 Kibana 的 DevTools 和可视化页面验证数据已成功导入并展示。