JFR 与 JMC 性能分析实战
系统讲解 JFR 与 JMC 性能分析:JFR 低开销原理与事件体系、录制与命令行操作、JMC 图形化分析路径、生产环境持续录制、与 GC 和堆分析的结合,以及常见性能问题的排查套路。
category
系统讲解 JFR 与 JMC 性能分析:JFR 低开销原理与事件体系、录制与命令行操作、JMC 图形化分析路径、生产环境持续录制、与 GC 和堆分析的结合,以及常见性能问题的排查套路。
深入虚拟线程与结构化并发:平台线程与虚拟线程的对比、虚拟线程的创建与调度原理、StructuredTaskScope 结构化并发、与传统线程池的取舍、性能实测,以及迁移到虚拟线程时代的实战陷阱。
从 AopProxy 接口与 DefaultAopProxyFactory.createAopProxy 的判定分支出发,讲清 Spring 何时用 JDK 动态代理、何时用 CGLIB,proxyTargetClass 与 spring.aop.proxy-target-class 如何改变选择,以及 CGLIB 内联进 spring-core 后两种代理的字节码差异与各自硬限制。
HikariCP 是 Spring Boot 的默认连接池,但默认值从不为生产负载而设。本节从数据库连接上限倒推 maximum-pool-size,讲清 minimum-idle、max-lifetime 与数据库 wait_timeout 的关系,给出连接泄漏检测与超时配套,并用 Actuator 的 hikaricp.connections.* 指标判断该调池还是查慢 SQL。
派生查询只能表达简单条件,复杂查询要靠 @Query。本节讲 JPQL 的语法要点与两种参数写法、@Modifying 批量更新、接口投影与类投影的取舍、nativeQuery 的适用场景与代价,以及 EntityManager、JdbcTemplate、查询超时与 JPQL 的能力边界。
讲清自动配置的退让(back off)机制:用户 Bean 如何通过 @ConditionalOnMissingBean 让自动配置让位,spring.autoconfigure.exclude 与 @SpringBootApplication(exclude=...) 的差别,以及覆盖自动配置 Bean 的几种做法各自的风险。
把消息投递做可靠:讲清生产者 acks 与幂等、事务性发送的真实边界,消费者手动 ack 与「先落库再提交位点」的先后顺序、业务唯一键去重、重试与死信主题的落地写法,并用一张表对比至少一次、至多一次、恰好一次在借阅通知场景下的真实含义与取舍。
从 Condition 接口、ConditionContext 到 @Conditional 的评估时机,拆解 OnClassCondition、OnBeanCondition、OnWebApplicationCondition 三者的实现思路:批量过滤、REGISTER_BEAN 阶段判断,以及评估结果如何被缓存并汇总进 --debug 报告。
以 Spring Kafka 为主、RabbitMQ 为对照,讲清借阅事件通知的生产端与消费端落地:starter 与模块化依赖、序列化选型、@KafkaListener 容器工厂与并发度、消费位点提交模式、批量消费,以及生产端发送回调与分区顺序保证。
从 spring.factories 到 AutoConfiguration.imports,逐层拆开 Spring Boot 4 自动配置类的发现、过滤与排序:AutoConfigurationSorter 如何在 @AutoConfigureBefore/@AutoConfigureAfter 与 @AutoConfigureOrder 之上做拓扑排序,以及为何还要用全限定名做兜底。
讲清 @Async 的代理前提与自调用失效,说明默认 SimpleAsyncTaskExecutor 为何不能上生产,给出自定义 ThreadPoolTaskExecutor、TaskDecorator 上下文传递、有界队列与拒绝策略、CompletableFuture 异常的落地写法,并分析虚拟线程对线程池选型的影响。
图书、作者、分类之间天然存在关联。本节用图书服务演示 @OneToOne、@OneToMany、@ManyToOne、@ManyToMany 四种映射,讲清 mappedBy 与关系维护方、@JoinColumn 指定外键、级联与 orphanRemoval 的取舍,并用 show-sql 直观演示 N+1 问题。
走完 getBean() 到 doCreateBean 的解析链:用字节码调用次序说明三级缓存 singletonObjects / earlySingletonObjects / singletonFactories 为何能解掉 setter 循环依赖、构造器循环依赖为何必然失败,并对比 @Lazy 与 ObjectProvider 破环的代价。
用 @EnableMethodSecurity 与 @PreAuthorize/@PostAuthorize 做方法级授权,设计 RBAC 与资源级权限,并在分馆租户模型下比较租户字段过滤、schema 隔离与库隔离的取舍,解决租户上下文在异步线程中的传播与越权测试。
BeanDefinition 是容器持有的元数据契约:本节拆开 AbstractBeanDefinition 的字段结构、BeanDefinitionRegistry 的注册与覆盖判定、组件扫描与 @Configuration 解析如何产出定义,讲清父子定义合并成 RootBeanDefinition 的过程,以及 @Primary 与别名在候选筛选里的作用。
对比无状态与 Session 在水平扩展、注销与吊销上的取舍,给出 HS256 与 RS256 的选型判据,用 JwtDecoder/JwtEncoder 落地签发与校验、token 过期与刷新轮换、密钥轮换与 kid,并列出算法混淆、none 算法等安全错误。
从 SpringApplication.run() 追到 ApplicationContext 可用:拆开 refresh() 的十二个步骤各自做了什么,标出 BeanFactoryPostProcessor 与 BeanPostProcessor 的介入时机,把本机实测启动日志逐行对回框架阶段,并给出断点位置与扩展点清单。
从 SecurityFilterChain bean 与 lambda DSL 讲起,梳理 4.x 的 Security starter 改名、过滤器链的执行顺序与各自职责、401 与 403 的分工、密码编码器与 UserDetailsService 的落地写法,并给出多链共存的常见配置陷阱。
本节把图书服务的查询需求变成方法名:讲清 findBy/readBy 等前缀与条件关键字的语法规则,给出 And、Between、Containing、In、OrderBy、IgnoreCase、Top 等关键字全表,说明属性路径导航与 @Query 的取舍,并用 @Modifying 实现更新删除、用投影接口只取需要的列。
缓存最难的从来不是怎么放,而是数据变了以后怎么办:讲清 Cache-Aside 的读写顺序为何推荐先写库再删缓存、延迟双删与订阅 binlog 各自换来了什么、穿透击穿雪崩三种故障的对策、缓存与事务边界如何对齐,以及一致性要求高时「不用缓存」这个正当选项。